diff --git a/AUTHORS b/AUTHORS
index 2800b62..7ccd755 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -533,7 +533,8 @@ Other contributions
      Janne Huttunen               - V3 actor mask support, Dig/FT SMUSH audio
      Kovacs Endre Janos           - Several fixes for Simon1
      Jeroen Janssen               - Numerous readability and bugfix patches
-     Keith Kaisershot             - Several Pegasus Prime patches
+     Keith Kaisershot             - Several Pegasus Prime patches and DVD
+                                    additions
      Andreas Karlsson             - Initial port for SymbianOS
      Claudio Matsuoka             - Daily Linux builds
      Thomas Mayer                 - PSP port contributions
diff --git a/Makefile b/Makefile
index 93a84a5..8f84b26 100644
--- a/Makefile
+++ b/Makefile
@@ -78,7 +78,7 @@ ZIP     ?= zip -q
 # Misc stuff - you should never have to edit this                     #
 #######################################################################
 
-EXECUTABLE  := $(EXEPRE)scummvm$(EXEEXT)
+EXECUTABLE  := $(EXEPRE)PegasusPrime$(EXEEXT)
 
 include $(srcdir)/Makefile.common
 
diff --git a/Makefile.common b/Makefile.common
index b56300a..57647db 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -233,7 +233,7 @@ dist-src: \
 DIST_FILES_DOCS:=$(addprefix $(srcdir)/,AUTHORS COPYING COPYING.BSD COPYING.LGPL COPYING.FREEFONT COPYRIGHT NEWS README)
 
 # Themes files
-DIST_FILES_THEMES=scummmodern.zip scummclassic.zip
+DIST_FILES_THEMES=scummclassic.zip
 ifdef USE_TRANSLATION
 DIST_FILES_THEMES+=translations.dat
 endif
diff --git a/backends/mixer/sdl/sdl-mixer.cpp b/backends/mixer/sdl/sdl-mixer.cpp
index 7c709e9..b391782 100644
--- a/backends/mixer/sdl/sdl-mixer.cpp
+++ b/backends/mixer/sdl/sdl-mixer.cpp
@@ -33,7 +33,7 @@
 #ifdef GP2X
 #define SAMPLES_PER_SEC 11025
 #else
-#define SAMPLES_PER_SEC 22050
+#define SAMPLES_PER_SEC 44100
 #endif
 //#define SAMPLES_PER_SEC 44100
 
diff --git a/backends/platform/sdl/macosx/macosx-main.cpp b/backends/platform/sdl/macosx/macosx-main.cpp
index 1b9fc1b..712a4ab 100644
--- a/backends/platform/sdl/macosx/macosx-main.cpp
+++ b/backends/platform/sdl/macosx/macosx-main.cpp
@@ -20,13 +20,23 @@
  *
  */
 
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
 #include "common/scummsys.h"
 
 #ifdef MACOSX
 
 #include "backends/platform/sdl/macosx/macosx.h"
 #include "backends/plugins/sdl/sdl-provider.h"
+#include "base/commandLine.h"
 #include "base/main.h"
+#include "common/config-manager.h"
+#include "common/fs.h"
+
+#include "CoreFoundation/CoreFoundation.h"
+
+#define PEGASUS_DVD_TARGET "pegasus-dvd-release"
 
 int main(int argc, char *argv[]) {
 
@@ -41,8 +51,77 @@ int main(int argc, char *argv[]) {
 	PluginManager::instance().addPluginProvider(new SDLPluginProvider());
 #endif
 
+	// HACK: Special Pegasus release parameters
+
+	// Attempt to detect the PP Data directory
+	// Get URL of the Resource directory of the .app bundle
+	CFURLRef fileUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+
+	if (!fileUrl) {
+		warning("Failed to get bundle URL");
+		return 1;
+	}
+
+	// Try to convert the URL to an absolute path
+	char buf[MAXPATHLEN];
+	if (!CFURLGetFileSystemRepresentation(fileUrl, true, (UInt8 *)buf, sizeof(buf))) {
+		warning("Failed to get FS representation of bundle URL");
+		return 1;
+	}
+
+	CFRelease(fileUrl);
+
+	Common::String bundlePath(buf);
+	Common::FSNode bundleNode(bundlePath);
+	Common::FSNode bundleParent = bundleNode.getParent();
+	Common::FSNode ppDataDirectory = bundleParent.getChild("PP Data");
+
+	Common::String ppDataPath;
+
+	// If we have the "PP Data" folder in the same directory as this bundle
+	if (ppDataDirectory.exists()) {
+		// Try to use this directory
+		ppDataPath = ppDataDirectory.getPath();
+	} else {
+		// Try to get it off the disc
+		Common::String discPath("/Volumes/Journeyman/");
+		Common::FSNode discNode(discPath);
+		Common::FSNode discDataDirectory = discNode.getChild("PP Data");
+		if (discDataDirectory.exists()) {
+			ppDataPath = discDataDirectory.getPath();
+		} else {
+			warning("Game data missing");
+			return 1;
+		}
+	}
+
+	// Work this into the config file
+	Base::registerDefaults();
+	ConfMan.loadDefaultConfigFile();
+
+	// Add the special target if it doesn't already exist
+	if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) {
+		ConfMan.addGameDomain(PEGASUS_DVD_TARGET);
+		ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET);
+		ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET);
+		ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET);
+		ConfMan.set("platform", "macintosh", PEGASUS_DVD_TARGET);
+	}
+
+	// Always update the path
+	ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET);
+
+	// Flush for good luck
+	ConfMan.flushToDisk();
+
+	const char *pegasusParams[] = {
+		argv[0],
+		"--gui-theme=scummpegasus",
+		PEGASUS_DVD_TARGET
+	};
+
 	// Invoke the actual ScummVM main entry point:
-	int res = scummvm_main(argc, argv);
+	int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams);
 
 	// Free OSystem
 	delete (OSystem_MacOSX *)g_system;
diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp
index 924e33b..5e61df3 100644
--- a/backends/platform/sdl/macosx/macosx.cpp
+++ b/backends/platform/sdl/macosx/macosx.cpp
@@ -43,7 +43,7 @@
 
 OSystem_MacOSX::OSystem_MacOSX()
 	:
-	OSystem_POSIX("Library/Preferences/ScummVM Preferences") {
+	OSystem_POSIX("Library/Preferences/Pegasus Prime Preferences") {
 }
 
 void OSystem_MacOSX::init() {
diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp
index d07db11..2bacaa8 100644
--- a/backends/platform/sdl/posix/posix-main.cpp
+++ b/backends/platform/sdl/posix/posix-main.cpp
@@ -20,13 +20,23 @@
  *
  */
 
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
 #include "common/scummsys.h"
 
 #if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3)
 
+#include <mntent.h>
+
 #include "backends/platform/sdl/posix/posix.h"
 #include "backends/plugins/sdl/sdl-provider.h"
+#include "base/commandLine.h"
 #include "base/main.h"
+#include "common/config-manager.h"
+#include "common/fs.h"
+
+#define PEGASUS_DVD_TARGET "pegasus-dvd-release"
 
 int main(int argc, char *argv[]) {
 
@@ -41,8 +51,63 @@ int main(int argc, char *argv[]) {
 	PluginManager::instance().addPluginProvider(new SDLPluginProvider());
 #endif
 
+	Common::String dataPath(DATA_PATH);
+	Common::FSNode ppDataDirectory(dataPath + "/PP Data/");
+
+	Common::String ppDataPath;
+
+	// If we have the "PP Data" folder in the same directory as this bundle
+	if (ppDataDirectory.exists()) {
+		// Try to use this directory
+		ppDataPath = ppDataDirectory.getPath();
+	} else {
+		// Search mounted volumes for the Journeyman disc
+		bool foundData = false;
+		FILE* fp = setmntent(_PATH_MOUNTED, "r");
+		mntent* ent;
+		while ((ent = getmntent(fp))) {
+			Common::String discPath(ent->mnt_dir);
+			Common::FSNode discNode(discPath);
+			Common::FSNode discDataDirectory = discNode.getChild("PP Data");
+			if (discDataDirectory.exists()) {
+				foundData = true;
+				ppDataPath = discDataDirectory.getPath();
+				break;
+			}
+		}
+		
+		if (!foundData) {
+			warning("Game data missing");
+			return 1;
+		}
+	}
+
+	Base::registerDefaults();
+	ConfMan.loadDefaultConfigFile();
+
+	// Add the special target if it doesn't already exist
+	if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) {
+		ConfMan.addGameDomain(PEGASUS_DVD_TARGET);
+		ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET);
+		ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET);
+		ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET);
+		ConfMan.set("platform", "linux", PEGASUS_DVD_TARGET);
+	}
+
+	// Always update the path
+	ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET);
+
+	// Flush for good luck
+	ConfMan.flushToDisk();
+
+	const char *pegasusParams[] = {
+		argv[0],
+		"--gui-theme=scummpegasus",
+		PEGASUS_DVD_TARGET
+	};
+
 	// Invoke the actual ScummVM main entry point:
-	int res = scummvm_main(argc, argv);
+	int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams);
 
 	// Free OSystem
 	delete (OSystem_POSIX *)g_system;
diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp
index a711c3a..2d8a4e5 100644
--- a/backends/platform/sdl/posix/posix.cpp
+++ b/backends/platform/sdl/posix/posix.cpp
@@ -107,7 +107,7 @@ Common::WriteStream *OSystem_POSIX::createLogFile() {
 #ifdef MACOSX
 	logFile += "/Library";
 #else
-	logFile += "/.scummvm";
+	logFile += "/.PegasusPrime";
 #endif
 #ifdef SAMSUNGTV
 	logFile = "/mtd_ram";
@@ -151,7 +151,7 @@ Common::WriteStream *OSystem_POSIX::createLogFile() {
 		return 0;
 	}
 
-	logFile += "/scummvm.log";
+	logFile += "/Pegasus Prime.log";
 
 	Common::FSNode file(logFile);
 	Common::WriteStream *stream = file.createWriteStream();
diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h
index 01a0152..f2e6a46 100644
--- a/backends/platform/sdl/posix/posix.h
+++ b/backends/platform/sdl/posix/posix.h
@@ -28,7 +28,7 @@
 class OSystem_POSIX : public OSystem_SDL {
 public:
 	// Let the subclasses be able to change _baseConfigName in the constructor
-	OSystem_POSIX(Common::String baseConfigName = ".scummvmrc");
+	OSystem_POSIX(Common::String baseConfigName = ".PegasusPrimerc");
 	virtual ~OSystem_POSIX() {}
 
 	virtual bool hasFeature(Feature f);
diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp
index e5b26c3..a93c04a 100644
--- a/backends/platform/sdl/win32/win32-main.cpp
+++ b/backends/platform/sdl/win32/win32-main.cpp
@@ -37,13 +37,18 @@
 
 #include "backends/platform/sdl/win32/win32.h"
 #include "backends/plugins/sdl/sdl-provider.h"
+#include "base/commandLine.h"
 #include "base/main.h"
+#include "common/config-manager.h"
+#include "common/fs.h"
 
 int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/,  LPSTR /*lpCmdLine*/, int /*iShowCmd*/) {
 	SDL_SetModuleHandle(GetModuleHandle(NULL));
 	return main(__argc, __argv);
 }
 
+#define PEGASUS_DVD_TARGET "pegasus-dvd-release"
+
 int main(int argc, char *argv[]) {
 	// Create our OSystem instance
 	g_system = new OSystem_Win32();
@@ -56,8 +61,82 @@ int main(int argc, char *argv[]) {
 	PluginManager::instance().addPluginProvider(new SDLPluginProvider());
 #endif
 
+	// Get the path to our EXE
+	HMODULE hModule = GetModuleHandleW(NULL);
+	WCHAR wideCharPath[MAX_PATH];
+	GetModuleFileNameW(hModule, wideCharPath, MAX_PATH);
+
+	// Convert to ANSI
+	char buf[MAX_PATH];
+	WideCharToMultiByte(CP_ACP, 0, wideCharPath, -1, buf, MAX_PATH, NULL, NULL);
+
+	// Find the directory the EXE is in
+	Common::String exePath(buf);
+	Common::FSNode exeNode(exePath);
+	Common::FSNode ppDataDirectory = exeNode.getParent().getChild("PP Data");
+
+	Common::String ppDataPath;
+
+	// If we have the "PP Data" folder in the same directory as this bundle
+	if (ppDataDirectory.exists()) {
+		// Try to use this directory
+		ppDataPath = ppDataDirectory.getPath();
+	} else {
+		// Search mounted volumes for the Journeyman disc
+		bool foundData = false;
+		char szLogicalDrives[26 * 4 + 1];
+		DWORD dwResult = GetLogicalDriveStrings(sizeof(szLogicalDrives), szLogicalDrives);
+		if (dwResult > 0 && dwResult <= sizeof(szLogicalDrives)) {
+			char *szSingleDrive = szLogicalDrives;
+			while (*szSingleDrive) {
+				if (GetVolumeInformation(szSingleDrive, buf, sizeof(buf), NULL, NULL, NULL, NULL, 0) && !scumm_stricmp(buf, "Journeyman")) {
+					Common::String discPath(szSingleDrive);
+					Common::FSNode discNode(discPath);
+					Common::FSNode discDataDirectory = discNode.getChild("PP Data");
+					if (discDataDirectory.exists()) {
+						foundData = true;
+						ppDataPath = discDataDirectory.getPath();
+						break;
+					}
+				}
+				szSingleDrive += strlen(szSingleDrive) + 1;
+			}
+		}
+
+		if (!foundData) {
+			warning("Game data missing");
+			return 1;
+		}
+	}
+
+	// Work this into the config file
+	Base::registerDefaults();
+	ConfMan.loadDefaultConfigFile();
+
+	// Add the special target if it doesn't already exist
+	if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) {
+		ConfMan.addGameDomain(PEGASUS_DVD_TARGET);
+		ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET);
+		ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET);
+		ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET);
+		ConfMan.set("console", "false", PEGASUS_DVD_TARGET);
+		ConfMan.set("platform", "windows", PEGASUS_DVD_TARGET);
+	}
+
+	// Always update the path
+	ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET);
+
+	// Flush for good luck
+	ConfMan.flushToDisk();
+
+	const char *pegasusParams[] = {
+		argv[0],
+		"--gui-theme=scummpegasus",
+		PEGASUS_DVD_TARGET
+	};
+
 	// Invoke the actual ScummVM main entry point:
-	int res = scummvm_main(argc, argv);
+	int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams);
 
 	// Free OSystem
 	delete (OSystem_Win32 *)g_system;
diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp
index 5f860ad..eb89ffb 100644
--- a/backends/platform/sdl/win32/win32.cpp
+++ b/backends/platform/sdl/win32/win32.cpp
@@ -44,7 +44,7 @@
 
 #include "common/memstream.h"
 
-#define DEFAULT_CONFIG_FILE "scummvm.ini"
+#define DEFAULT_CONFIG_FILE "Pegasus Prime.ini"
 
 void OSystem_Win32::init() {
 	// Initialize File System Factory
@@ -175,10 +175,10 @@ Common::String OSystem_Win32::getDefaultConfigFileName() {
 			}
 		}
 
-		strcat(configFile, "\\ScummVM");
+		strcat(configFile, "\\Pegasus Prime");
 		if (!CreateDirectory(configFile, NULL)) {
 			if (GetLastError() != ERROR_ALREADY_EXISTS)
-				error("Cannot create ScummVM application data folder");
+				error("Cannot create Pegasus Prime application data folder");
 		}
 
 		strcat(configFile, "\\" DEFAULT_CONFIG_FILE);
@@ -237,11 +237,11 @@ Common::WriteStream *OSystem_Win32::createLogFile() {
 			CreateDirectory(logFile, NULL);
 		}
 
-		strcat(logFile, "\\ScummVM");
+		strcat(logFile, "\\Pegasus Prime");
 		CreateDirectory(logFile, NULL);
 		strcat(logFile, "\\Logs");
 		CreateDirectory(logFile, NULL);
-		strcat(logFile, "\\scummvm.log");
+		strcat(logFile, "\\Pegasus Prime.log");
 
 		Common::FSNode file(logFile);
 		Common::WriteStream *stream = file.createWriteStream();
diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp
index 9682832..b31d820 100644
--- a/backends/saves/posix/posix-saves.cpp
+++ b/backends/saves/posix/posix-saves.cpp
@@ -43,9 +43,9 @@
 
 
 #ifdef MACOSX
-#define DEFAULT_SAVE_PATH "Documents/ScummVM Savegames"
+#define DEFAULT_SAVE_PATH "Library/Application Support/Pegasus Prime Saves"
 #else
-#define DEFAULT_SAVE_PATH ".scummvm"
+#define DEFAULT_SAVE_PATH ".PegasusPrime"
 #endif
 
 POSIXSaveFileManager::POSIXSaveFileManager() {
diff --git a/backends/saves/windows/windows-saves.cpp b/backends/saves/windows/windows-saves.cpp
index b84ab13..943ea75 100644
--- a/backends/saves/windows/windows-saves.cpp
+++ b/backends/saves/windows/windows-saves.cpp
@@ -63,16 +63,16 @@ WindowsSaveFileManager::WindowsSaveFileManager() {
 			}
 		}
 
-		strcat(defaultSavepath, "\\ScummVM");
+		strcat(defaultSavepath, "\\Pegasus Prime");
 		if (!CreateDirectory(defaultSavepath, NULL)) {
 			if (GetLastError() != ERROR_ALREADY_EXISTS)
-				error("Cannot create ScummVM application data folder");
+				error("Cannot create Pegasus Prime application data folder");
 		}
 
 		strcat(defaultSavepath, "\\Saved games");
 		if (!CreateDirectory(defaultSavepath, NULL)) {
 			if (GetLastError() != ERROR_ALREADY_EXISTS)
-				error("Cannot create ScummVM Saved games folder");
+				error("Cannot create Pegasus Prime Saved games folder");
 		}
 
 		ConfMan.registerDefault("savepath", defaultSavepath);
diff --git a/configure b/configure
index 5499cec..b874090 100755
--- a/configure
+++ b/configure
@@ -159,7 +159,7 @@ _plugin_prefix=
 _plugin_suffix=
 _nasm=auto
 _optimization_level=
-_default_optimization_level=-O2
+_default_optimization_level=-Os
 # Default commands
 _ranlib=ranlib
 _strip=strip
diff --git a/devtools/credits.pl b/devtools/credits.pl
index 53f0d11..4fdc0db 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -1097,7 +1097,7 @@ begin_credits("Credits");
 				add_person("Janne Huttunen", "", "V3 actor mask support, Dig/FT SMUSH audio");
 				add_person("Kov&aacute;cs Endre J&aacute;nos", "", "Several fixes for Simon1");
 				add_person("Jeroen Janssen", "japj", "Numerous readability and bugfix patches");
-				add_person("Keith Kaisershot", "blitter", "Several Pegasus Prime patches");
+				add_person("Keith Kaisershot", "blitter", "Several Pegasus Prime patches and DVD additions");
 				add_person("Andreas Karlsson", "Sprawl", "Initial port for SymbianOS");
 				add_person("Claudio Matsuoka", "", "Daily Linux builds");
 				add_person("Thomas Mayer", "", "PSP port contributions");
diff --git a/dists/pegasus/Info.plist b/dists/pegasus/Info.plist
new file mode 100644
index 0000000..4490d1e
--- /dev/null
+++ b/dists/pegasus/Info.plist
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleLocalizations</key>
+	<array>
+		<string>en</string>
+		<string>ca</string>
+		<string>cs</string>
+		<string>da</string>
+		<string>de</string>
+		<string>es</string>
+		<string>fr</string>
+		<string>hu</string>
+		<string>it</string>
+		<string>nb</string>
+		<string>nn</string>
+		<string>pl</string>
+		<string>pt</string>
+		<string>ru</string>
+		<string>se</string>
+		<string>uk</string>
+	</array>
+	<key>CFBundleDisplayName</key>
+	<string>ScummVM</string>
+	<key>CFBundleExecutable</key>
+	<string>scummvm</string>
+	<key>CFBundleGetInfoString</key>
+	<string>1.6.0git, Copyright 2001-2013 The ScummVM team</string>
+	<key>CFBundleIconFile</key>
+	<string>pegasus.icns</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.scummvm.scummvm</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>ScummVM</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.6.0git</string>
+	<key>CFBundleVersion</key>
+	<string>1.6.0git</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>Copyright 2001-2013 The ScummVM team</string>
+	<key>SUFeedURL</key>
+	<string>http://www.scummvm.org/appcasts/macosx/release.xml</string>
+	<key>SUPublicDSAKeyFile</key>
+	<string>dsa_pub.pem</string>
+</dict>
+</plist>
diff --git a/dists/pegasus/PegasusPrime.desktop b/dists/pegasus/PegasusPrime.desktop
new file mode 100644
index 0000000..a9a2a63
--- /dev/null
+++ b/dists/pegasus/PegasusPrime.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=Pegasus Prime
+Comment=The epic time travel adventure begins
+Exec=PegasusPrime
+Icon=pegasus
+Terminal=false
+Type=Application
+Categories=Game;AdventureGame;
+StartupNotify=false
diff --git a/dists/pegasus/debian/README.source b/dists/pegasus/debian/README.source
new file mode 100644
index 0000000..a7252c2
--- /dev/null
+++ b/dists/pegasus/debian/README.source
@@ -0,0 +1,10 @@
+This project uses a custom build of ScummVM licensed under GNU GPLv2 using
+revision d04667e58a889e4744f36fb5797a69fa437a1abf. You may obtain the sources
+from GitHub: https://github.com/scummvm/scummvm (direct link:
+https://github.com/scummvm/scummvm/archive/d04667e58a889e4744f36fb5797a69fa437a1abf.zip).
+On top of that revision, it has been patched with the "full_patch.diff"
+(included in the pegasusprime source tarball) The dists/pegasus directory
+missing from the patch is also included in the pegasusprime source tarball.
+
+This is a cutdown ScummVM build because Pegasus Prime does not need many of the
+usual features of ScummVM.
diff --git a/dists/pegasus/debian/changelog b/dists/pegasus/debian/changelog
new file mode 100644
index 0000000..c681a98
--- /dev/null
+++ b/dists/pegasus/debian/changelog
@@ -0,0 +1,29 @@
+pegasusprime (1.0-5) unstable; urgency=low
+
+  * Minor bugfix release
+
+ -- Keith Kaisershot <archives@thejourneymanproject.com>  Mon, 10 Mar 2014 13:29:11 -0800
+
+pegasusprime (1.0-4) unstable; urgency=low
+
+  * Minor bugfix release
+
+ -- Keith Kaisershot <archives@thejourneymanproject.com>  Sun, 09 Mar 2014 18:18:45 -0800
+
+pegasusprime (1.0-3) unstable; urgency=low
+
+  * Minor bugfix release
+
+ -- Keith Kaisershot <archives@thejourneymanproject.com>  Thu, 27 Feb 2014 10:05:56 -0800
+
+pegasusprime (1.0-2) unstable; urgency=low
+
+  * Minor bugfix release
+
+ -- Keith Kaisershot <archives@thejourneymanproject.com>  Mon, 24 Feb 2014 18:15:56 -0800
+
+pegasusprime (1.0-1) unstable; urgency=low
+
+  * Initial release
+
+ -- Keith Kaisershot <archives@thejourneymanproject.com>  Tue, 31 Dec 2013 15:44:53 -0600
diff --git a/dists/pegasus/debian/compat b/dists/pegasus/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/dists/pegasus/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/dists/pegasus/debian/control b/dists/pegasus/debian/control
new file mode 100644
index 0000000..0362061
--- /dev/null
+++ b/dists/pegasus/debian/control
@@ -0,0 +1,17 @@
+Source: pegasusprime
+Section: games
+Priority: optional
+Maintainer: Keith Kaisershot <archives@thejourneymanproject.com>
+Build-Depends: debhelper (>= 7.0.50~), autotools-dev
+Standards-Version: 3.8.4
+Homepage: http://www.thejourneymanproject.com
+
+Package: pegasusprime
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: time travel adventure game
+ Experience the origin of the Journeyman Project series in this "director's
+ cut" remake of the award-winning time travel adventure game with greatly
+ enhanced animation and sound. As Agent 5 of the Temporal Protectorate, you
+ must explore across centuries for clues to a sinister mystery as Earth's
+ future hangs in the balance.
diff --git a/dists/pegasus/debian/copyright b/dists/pegasus/debian/copyright
new file mode 100644
index 0000000..2fa382e
--- /dev/null
+++ b/dists/pegasus/debian/copyright
@@ -0,0 +1,36 @@
+Pegasus Prime was debianized by Keith Kaisershot <archives@thejourneymanproject.com> the 31st Dec 2013.
+
+Upstream Authors: see `/usr/share/doc/scummvm/AUTHORS'.
+
+ScummVM is Copyright © 2002-2013 The ScummVM Project
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ On Debian GNU/Linux systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL'.
+
+This copyright also applies to the Debian-related build scripts.
+
+Some parts of ScummVM (the mt32 softsynth code) is covered by a more
+permissive BSD-style license:
+
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
diff --git a/dists/pegasus/debian/docs b/dists/pegasus/debian/docs
new file mode 100644
index 0000000..c73c810
--- /dev/null
+++ b/dists/pegasus/debian/docs
@@ -0,0 +1,5 @@
+AUTHORS
+COPYRIGHT
+README
+TODO
+NEWS
diff --git a/dists/pegasus/debian/menu b/dists/pegasus/debian/menu
new file mode 100644
index 0000000..bf946ff
--- /dev/null
+++ b/dists/pegasus/debian/menu
@@ -0,0 +1,3 @@
+?package(pegasusprime):needs="x11" section="Games/Adventure" \
+  title="Pegasus Prime" command="/usr/games/PegasusPrime" \
+  icon="/usr/share/icons/pegasus.xpm"
diff --git a/dists/pegasus/debian/rules b/dists/pegasus/debian/rules
new file mode 100755
index 0000000..5f72554
--- /dev/null
+++ b/dists/pegasus/debian/rules
@@ -0,0 +1,12 @@
+#!/usr/bin/make -f
+
+%:
+	dh $@ 
+
+override_dh_auto_configure:
+	./configure --prefix=/usr --bindir=/usr/games --datadir=/usr/share/PegasusPrime --docdir=/usr/share/doc/pegasusprime --disable-all-engines --enable-engine=pegasus --enable-optimizations --enable-keymapper --disable-eventrecorder --disable-mt32emu --disable-alsa --disable-bink --disable-faad --disable-flac --disable-fluidsynth --disable-mad --disable-png --disable-timidity
+
+override_dh_auto_test:
+
+
+
diff --git a/dists/pegasus/debian/source/format b/dists/pegasus/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/dists/pegasus/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/dists/pegasus/pegasus.icns b/dists/pegasus/pegasus.icns
new file mode 100644
index 0000000..83a4351
Binary files /dev/null and b/dists/pegasus/pegasus.icns differ
diff --git a/dists/pegasus/pegasus.ico b/dists/pegasus/pegasus.ico
new file mode 100644
index 0000000..d523358
Binary files /dev/null and b/dists/pegasus/pegasus.ico differ
diff --git a/dists/pegasus/pegasus.xpm b/dists/pegasus/pegasus.xpm
new file mode 100644
index 0000000..d967ede
--- /dev/null
+++ b/dists/pegasus/pegasus.xpm
@@ -0,0 +1,518 @@
+/* XPM */
+static const char *pegasus_icon[] = {
+/* columns rows colors chars-per-pixel */
+"256 256 256 2 ",
+"   c #010101",
+".  c #0B0301",
+"X  c #010B01",
+"o  c #0B0B02",
+"O  c #02010B",
+"+  c #0B030B",
+"@  c #060A0B",
+"#  c #130301",
+"$  c #1B0301",
+"%  c #130B02",
+"&  c #180B07",
+"*  c #061403",
+"=  c #171504",
+"-  c #020113",
+";  c #090516",
+":  c #150916",
+">  c #171618",
+",  c #0A1415",
+"<  c #240301",
+"1  c #2C0200",
+"2  c #270B03",
+"3  c #330300",
+"4  c #3B0300",
+"5  c #340C01",
+"6  c #3B0B01",
+"7  c #38090B",
+"8  c #2C1400",
+"9  c #261703",
+"0  c #331300",
+"q  c #3B1300",
+"w  c #371A03",
+"e  c #261717",
+"r  c #310E17",
+"t  c #18280A",
+"y  c #282703",
+"u  c #372702",
+"i  c #2F2C11",
+"p  c #050225",
+"a  c #170526",
+"s  c #16112D",
+"d  c #261627",
+"f  c #2D1231",
+"g  c #2F282D",
+"h  c #1C202A",
+"j  c #470902",
+"k  c #560A03",
+"l  c #441401",
+"z  c #4B1B00",
+"x  c #481702",
+"c  c #531C00",
+"v  c #591704",
+"b  c #4F1216",
+"n  c #661906",
+"m  c #661B15",
+"M  c #73170C",
+"N  c #492702",
+"B  c #542300",
+"V  c #5B2300",
+"C  c #592A02",
+"Z  c #493502",
+"A  c #583803",
+"S  c #4E2D16",
+"D  c #632C01",
+"F  c #692605",
+"G  c #762906",
+"H  c #683602",
+"J  c #773603",
+"K  c #6B2517",
+"L  c #782916",
+"P  c #723618",
+"I  c #4E132D",
+"U  c #6E192D",
+"Y  c #502D2D",
+"T  c #732D2A",
+"R  c #374619",
+"E  c #564606",
+"W  c #694703",
+"Q  c #784703",
+"!  c #764816",
+"~  c #705208",
+"^  c #776B07",
+"/  c #77492D",
+"(  c #5D532A",
+")  c #12044D",
+"_  c #2E104C",
+"`  c #332A4D",
+"'  c #310E6D",
+"]  c #22156A",
+"[  c #4F1250",
+"{  c #772C4F",
+"}  c #5D2264",
+"|  c #6B5354",
+" . c #3A474B",
+".. c #873904",
+"X. c #852A19",
+"o. c #863719",
+"O. c #913209",
+"+. c #AD3503",
+"@. c #872A26",
+"#. c #8A3626",
+"$. c #96392B",
+"%. c #963736",
+"&. c #8B2D34",
+"*. c #A33D2F",
+"=. c #871A0F",
+"-. c #874902",
+";. c #974904",
+":. c #895602",
+">. c #965902",
+",. c #904B18",
+"<. c #A75703",
+"1. c #B05009",
+"2. c #996602",
+"3. c #8E6D07",
+"4. c #A56903",
+"5. c #B86803",
+"6. c #A97506",
+"7. c #B77804",
+"8. c #AF7316",
+"9. c #95452A",
+"0. c #984937",
+"q. c #8E492C",
+"w. c #A6452B",
+"e. c #A64533",
+"r. c #B64F2E",
+"t. c #B06D2D",
+"y. c #8D6D2F",
+"u. c #C8540B",
+"i. c #C66904",
+"p. c #C87702",
+"a. c #D67903",
+"s. c #D1700F",
+"d. c #E67903",
+"f. c #F17105",
+"g. c #C95626",
+"h. c #CD562D",
+"j. c #D0712D",
+"k. c #E95F15",
+"l. c #92314D",
+"z. c #93306F",
+"x. c #A33365",
+"c. c #984B4B",
+"v. c #A64F52",
+"b. c #95476F",
+"n. c #AB506F",
+"m. c #A76C59",
+"M. c #D2645D",
+"N. c #C13800",
+"B. c #B6870D",
+"V. c #A6950F",
+"C. c #C88603",
+"Z. c #D88703",
+"A. c #D1920D",
+"S. c #E68803",
+"D. c #E99702",
+"F. c #F99902",
+"G. c #F39011",
+"H. c #D7AC05",
+"J. c #FEA401",
+"K. c #FEAB00",
+"L. c #F7A705",
+"P. c #FEB400",
+"I. c #FFBB00",
+"U. c #F9B808",
+"Y. c #FEA916",
+"T. c #FEB718",
+"R. c #E8AC05",
+"E. c #CE8B2E",
+"W. c #EB942A",
+"Q. c #FBB32E",
+"!. c #DCAC2B",
+"~. c #FFC400",
+"^. c #FECB00",
+"/. c #FAC708",
+"(. c #FED400",
+"). c #FFDB01",
+"_. c #FAD808",
+"`. c #FFC719",
+"'. c #F7D411",
+"]. c #FFE400",
+"[. c #FFEB00",
+"{. c #FBE609",
+"}. c #FFF300",
+"|. c #FFFE00",
+" X c #FDF508",
+".X c #FDEA16",
+"XX c #FFC728",
+"oX c #FFD82A",
+"OX c #FFC737",
+"+X c #FFD535",
+"@X c #EBCF2C",
+"#X c #FEE92E",
+"$X c #D6CA06",
+"%X c #AA9361",
+"&X c #FBB44C",
+"*X c #E3985E",
+"=X c #FECB4D",
+"-X c #FECF73",
+";X c #FFE96E",
+":X c #FCE855",
+">X c #320A90",
+",X c #3509AE",
+"<X c #211698",
+"1X c #591FA0",
+"2X c #6A51A6",
+"3X c #3407D0",
+"4X c #3106F9",
+"5X c #2623E7",
+"6X c #4F0EFA",
+"7X c #6E14FD",
+"8X c #712FFA",
+"9X c #5B22DA",
+"0X c #6A52EA",
+"qX c #962F8C",
+"wX c #A230A3",
+"eX c #AE528E",
+"rX c #AF50AF",
+"tX c #A25A9A",
+"yX c #CF5F9E",
+"uX c #A735D0",
+"iX c #8B19FE",
+"pX c #8C36F6",
+"aX c #B737FE",
+"sX c #AB33F9",
+"dX c #9A2ADA",
+"fX c #CA35FE",
+"gX c #E039E4",
+"hX c #B352CE",
+"jX c #954BF6",
+"kX c #B14FF7",
+"lX c #A357D9",
+"zX c #CF52CF",
+"xX c #CF50FC",
+"cX c #FD5AFF",
+"vX c #EC50FC",
+"bX c #D36CFB",
+"nX c #FE67FF",
+"mX c #FD77FE",
+"MX c #E86FFB",
+"NX c #D868D0",
+"BX c #C92FAB",
+"VX c #FDB394",
+"CX c #FDB3AC",
+"ZX c #E3929D",
+"AX c #FFCD8F",
+"SX c #FEEE8A",
+"DX c #FFCAAA",
+"FX c #FFEDAD",
+"GX c #FF86FE",
+"HX c #FF97FF",
+"JX c #F491E9",
+"KX c #FEB1FA",
+"LX c #F9A7D0",
+"PX c #FFC7D8",
+"IX c #9E9595",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& = = = > = > t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXg g i i e w 9 2 8 8 8 0 w 9 9 e e h g ` ` ` ` `  .` UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> g g Y ` Y Y b l q 0 7 5 5 2 1 3 1 7 q q l 7 S I Y `  .`  . .<X .<X`  .UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe e i S S Y S Y r 5 < 1 < < < < # # # # % 3 k k k x j x j x r i e ` ` ` `  . . .` R UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i i S S S b q 5 3 1 < # % # . . . . .       . 7 M k k k j j k k k k k c b w i g R g g g t > t > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> e i S b x 6 7 3 < $ . . .       O       O     O   . b &.&.=.M n n M M n k n k v k k k j r r 9 e = % o * o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> g S S c x j 1 2 # . #             O   O   O   O O     . I &.l.l.&.@.@.@.L X.X.K F n k k j j 4 3 1 5 & % % % @ o o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe i S S b j 4 < # . .     .           O     O O   O   O O   . b { %.&.&.#.@.#.&.@.@.@.L L K n n n v k j 5 < < $ # # . . o o * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe i Y S k k 3 < # .   O   O   O     O O O     O       O O O . . : Y &.&.%.@.@.#.&.&.&.#.#.#.@.@.#.#.T L L K n k j 3 1 < $ % o o * * o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e i b x j 3 $ .         O O O     O O     O O     O   O O O O O @ : I l.&.#.&.#.&.#.$.$.#.#.o.#.#.#.#.@.@.L L L m n k j 3 3 < # . @ o * = t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% e e w b j 4 < # . O                 O       O     O O   O   O O + + . & Y %.%.%.%.%.$.%.$.#.#.$.#.#.#.o.L X.X.L L L L L K v v j 1 1 # # o * = t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e 2 7 j 4 1 #   .           O     O   O   O     O O     O O O O O ; + & > T l.v.e.e.e.9.9.$.$.$.9.#.#.#.#.#.#.#.#.X.L L L L K K n v 6 1 < # % = t i R t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo > 9 5 4 4 1 $ . O     O     O   O   O   O   O O     O   O   O   O O O + + & & T n.M.M.m.v.0.w.w.9.w.9.$.9.9.9.9.#.#.#.#.o.#.X.L =.M L K F k 4 1 < = t t y R R > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% e 2 5 j 3 $ .     O       O     O     O   O O     O     O         O     o & % e q.*XCXVXVX*X*X*X*Xt.h.r.r.0.q.#.$.#.#.o.@.o.o.o.o.X.L L L K n v j 4 1 & = t t y t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& > 1 4 4 1 # .             O     O   O     O     O O                   O X @ + & e 0.VXFXDXAX;X;X;X:X;X-XVX*X*XM.r.e.w.#.$.#.#.o.o.o.X.o.L K L G n F c j 1 < 9 t t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & 2 5 4 4 < .   O         O O   O O   O   O O   O                     O   @ X % > & 9 0.VXFXFX;X;X;X;X:X:X;X;X;X;X-X&X*X*Xe.,.w.9.$.O.o.o.#.L G L L G K m v j 4 1 $ o t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & r 7 4 3 $ .   O   O     O       O       O O   O                       X   X o @ > & e 0.AXDXDXSX-XSX;X;X;X;X:X;X:X:X:X-X-XVX*Xh.w.$.O.o.#.X.L L L L L G K F n v 4 < # * t t R t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ > r l j 3 $ .       O     O   O   O   O O                                     X X + > & w c.VXPXFXAX;XSXAX;XSX-X-X-X;X-X:X:X=X;XDXVXM.v.*.$.#.o.@.#.o.X.L L K G F F c j 1 % = * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d I b j 3 #       O O   O O   O       O   O                               X X O @ @ , & e i v.CXPXPXAXAX-XAXAXSXAXSX-X-X:X=X=X:X:X-XPXPXCXZXr.#.o.o.#.P P X.L L F K K K v l < $ * * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: f I r j 3 $ . O           O   O O   O O                                     @   @ @ , , > > e c.CXPXPXDXSXSXAXSXDXAXSXAX-X-X-X-X-X-X=XDXKXKXPXCX*Xg.,.#.#.#.L P X.G K m G K V x 3 2 o * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: d g I 7 4 $ O O O O O O   O         O                                           @ @ , , > > h i c.CXPXPXDXAXDXAXAXAXAXAXAXAX-X-XAX-X-X-X;XPXKXKXPXVXVXE.w.o.#.o.o.L L L K F n n n x 1 $ * * * * * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 r 7 j 1 # . O O O   O O       O O O                                   O     @ @ , , , , h > e r c.ZXKXCXDXAXAXAXAXAXDXAXDXAXAXAXAXVX-X-X-XCXLXCXAX-X-XVX*Xg.O.#.X.X.o.L P L n n n v q 1 #   @ X X   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% & e 7 4 4 $ O O O O O   O   O O O O                                         @ @ , @ , , , , , > e i v.JXKXPXDXDXDXFXDXDXAXDXDXDXDXAXAXAX-XAX-XAXAXVXAX-X-X-XVX-X*X$.X.@.@.P L L L K n m m x 1           X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & < 1 4 3 <   O   O O O O O O     O                                       X   @ , , , - @ , , , , e g n.JXJXDXDXDXDXDXAXAXDXAXAXDXDXDXAXAXAXAXVX-X-XVX-XVXVXAX-X-X-X*Xr.=.@.P L T L K K m V v x $             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: 2 1 3 j < . O O O O O O O     O O O                                     O @ @ , , , @ @ @ , , > > h g qXGXKXCXDXDXDXFXDXPXDXVXVXVXDXDXDXCXAXAXAX-X-X-X-X-XVX-XVX-XVXDXVXv.O.L #.T L L K F m n v j #             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & < 4 j 3 # O O O O O O O O O O O                                       O @ @ , @ , @ O - , h > d h d f rXGXKXLXPXPXPXPXPXPXPXDXCXCXVXDXCXDXDXAXAXAX-X-XVX-XVXAXVXAXCXCXJXLXM.=.X.@.P X.L K K n n v 7 X             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e & 1 j 4 # O - O O O O O   O O O O                                     O @ @ @ , @ O O O , s h h g g g Y tXGXKXKXKXKXPXKXKXKXKXKXPXDXVXVXDXVXAXVXAXAXAXAXVXVXVXDXDXLXPXKXKXHXJXyX@.o.T L P L m m v v x <               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 5 4 4 < O O - O O O O O O O O O                                     O - @ @ @ ; O @ , : h h ` ` ` g g g rXGXHXKXKXKXKXKXKXKXKXKXPXPXDXVXDXDXDXDXVXDXDXDXDXDXDXCXLXPXKXKXHXHXGXmXyX&.L L L L K m m v v j .           @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 5 j j 1 . O O O O O O O O O O                                   O O O O @ @ @ @ - - + @ , s g h ` g g g I tXGXKXPXPXPXPXPXPXKXKXKXKXLXCXCXCXCXCXDXCXCXCXPXPXLXLXPXKXKXKXHXGXGXGXGXmXzX{ U T T K K K m v v 5               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 1 4 j 4 # O - - - O O - - O O O                               O O O O O O @ @ @ + - @ ; @ @ , e d d g g g g b.LXPXPXFXDXDXDXPXPXPXKXKXKXLXCXVXZXCXCXCXLXLXKXKXKXKXKXKXKXHXGXGXGXGXGXHXGXzX{ L T L L K m n v k 2 X           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& < 1 4 4 < . - - - - O O O O - - O                                   O   O O @ O - + + + @ @ @ + , > d e d I Y l.ZXIX*XVXAXFXDXDXFXDXDXPXPXKXLXCXVXVXCXCXCXPXLXKXKXKXKXKXHXGXGXGXGXGXHXGXGXmXrXT L U K K m m n v j .           @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 2 3 4 1 # O - - - - O - O - O O                             O O O O O @ + + O @ + @ . . @ : > f I Y { { c.c.v.n.b.Y T T c.%XZXVXAXAXAXDXDXDXCXCXVXVXVXVXVXCXCXPXKXKXHXHXGXGXHXHXHXHXHXHXHXGXmXx.L L K K m m v v v 5 O             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & < 1 3 3 $ O p p p - - - - O O O                             O O O O O + @ + ; @ + .   o d Y { c.n.n.M.M.M.M.j.M.tX9X} g d e I Y P / 0.%X*XAXAXAXVXVXZXZXZXVXZXVXVXPXKXHXHXGXHXHXHXHXHXHXHXHXGXGXNX@.L K T K m m v v k $             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 1 1 4 1 O - p p p - - - - - O O                         O @ O O O @ @ + + O O % + + r T b.n.n.M.M.M.M.M.M.j.j.M.uX8X2X_ a : : 2 & r r S / y.*XVXVXVXVXVXZXZX*XZXVXZXJXmXHXHXHXHXKXHXHXHXHXHXHXmXnXeX@.T T K m m v v v 6               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ & 2 1 3 3 < O p p p p - p - - p O                         X @ - O O @ + @ O + + . . : Y c.BXM.M.M.M.M.j.k.h.k.h.j.h.rX8X9X) ; : : : : d f e 9 r S 0.*XAXAXVX*X*XM.*X*X*XZXJXGXHXHXHXHXKXHXKXHXHXHXGXnXvXl.L T K K m m v v x #             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& < 1 3 4 1 # p p ) p p p p p p -                         O O , - O O + ; + @ : # + f c.yXyXM.h.h.h.h.h.h.h.j.h.j.h.M.rXpX1X_ a : : a > a : > > e e w b 0.*XVXZX*X*XM.M.M.M.JXGXHXHXHXHXKXHXKXHXHXGXGXmXnXzXU L U U K m k v v 5 .             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 2 3 4 4 $ + p p p p p p p p - O                         @ ; - O O O @ + + . # d l.M.yXyXM.M.h.h.u.u.k.h.h.h.h.h.g.h.eXpX1X_ : & : > : : : : : : : > : r m v.M.ZXyXZX*XM.k.yXmXGXHXHXHXHXHXHXHXHXHXGXGXmXcXrXT M K K m m n v k #           @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% : < 1 4 1 + : ) ) ) p ) p p p O                         O O - O . O + . . O + Y v.yXyXM.M.h.h.h.h.h.h.k.h.h.h.h.h.g.r.qX8X1X_ : + : : + + : : + : : & : : & < Y M.LXNXZXyXM.M.NXnXGXJXHXHXHXHXHXHXGXGXGXmXmXvXl.m m K m m v v b 2               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ 2 1 1 4 1 : p ) ] ) p p p p p O                         O O O +   O     O & / yXyXM.h.h.h.h.N.h.h.N.g.h.h.h.h.h.g.g.t.b.dX1X) ; + ; ; ; ; + + + + + + : & : & & Y M.JXJXNXNXyXyXNXmXmXGXHXHXHXGXHXGXHXGXmXnXnXwXU K m m m m v v 6 .             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. % $ 1 1 3 < a ) ] ) ) ) ) ) p p O                         O O O     . .   2 x.yXyXM.M.k.h.h.h.N.N.h.h.h.g.g.h.h.h.g.g.t.b.dX1X_ - . + ; ; O O . + . O + & + & : + : b b.MXGXNXNXyXyXvXnXmXmXGXGXGXGXGXGXGXmXmXnXvXl.m m m m m m n x <               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& $ < < 3 3 $ ) <X<X] ) ) ) p p p                         O O O   O . . O r v.yXM.M.h.h.h.g.r.h.h.h.h.N.h.g.h.k.h.h.g.g.r.qX2X1X] - O . ; - O O   O O . + + + : + & & e d z.mXGXMXzXzXzXxXnXnXmXmXGXGXmXGXGXmXmXnXnXx.U K m m m v v v 3               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# # < 1 4 1 : <X<X<X) ] ) ) ) ) -                           O O . O   O 2 v.yXyXn.g.g.g.g.g.g.g.r.g.g.N.g.g.g.h.h.h.g.s.r.b.dX1X_ ;   + ; O O O     O O   O + + : : > > e d tXmXmXMXzXrXhXxXvXnXnXmXmXmXmXmXmXmXmXnXBXU T U m m m v v 6 .             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# & $ 7 7 r 7 _ 3X3X<X<X] ] ) ) p -                             O . .   < x.M.BXh.h.g.r.r.r.r.g.r.g.g.g.g.u.s.g.g.h.h.j.g.r.qX2X1X) -   O O O O           O O . + + ; : @ > > g zXGXmXMXzXrXhXxXvXcXnXnXmXmXmXmXnXmXnXgX{ K K m m m n v j $               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: d f f [ I _ >X4X4X<X<X<X] ] ) ) O                               . # # { M.eXM.h.r.r.r.r.h.h.r.r.h.r.g.g.g.g.g.g.g.h.g.g.r.eX9X1X_ -   O O O O O             O O O ; ; > > e > [ NXmXMXNXhXhXuXkXvXcXcXnXnXnXnXnXnXcXcXqXm m m m m m b x 3 .           @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: g ' ' [ U [ 3X4X4X5X<X<X] <X) p -                             . . . I n.n.v.r.r.r.r.r.r.r.r.r.g.r.N.r.g.r.u.g.g.u.g.u.g.t.b.uX1X_ - O O - O O O               . O @ , > e > > h } mXmXvXzXrXuXkXfXvXvXcXcXcXcXnXnXcXcXBXU K m m m v v v l .             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX > <X,X,X>X[ ] 3X4X4X4X3X<X<X<X) p O                           O .   j x.n.M.r.r.r.r.r.r.r.r.r.r.r.h.r.r.g.N.r.u.N.g.g.g.u.r.qX0X1Xf - O O - O O                   O @ , , > h h > > 2XmXnXNXyXwXrXaXaXvXvXvXcXcXcXcXcXcXgX} m m m m v v v l # O           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX, ) 9X0X9X1X1X<X5X4X4X4X4X3X<X<X) p - O                         . # # @.yXx.v.e.*.*.r.x.h.v.r.r.r.r.r.r.r.g.r.1.r.r.g.r.1.r.r.b.dX1Xf O   O O O O O         O O   O   @ , > > h > , > f hXmXnXzXeXwXuXsXxXxXvXcXcXvXcXvXvXgXqXY m m m m v v l < O             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXs <X5X5X8X9X,X,X3X4X4X4X4X4X<X<X) p - O   O                   .   $ b x.M.v.r.*.*.r.e.h.v.r.r.r.r.r.w.r.N.r.r.r.r.N.r.1.r.1.r.b.dX1X_ O   O O O O O               @ @ @ * t , > h d h g } MXnXzXBXeXwXuXaXfXxXvXvXvXvXvXvXsXqXU m m m b v v k < .             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX) <X8X0X5X3X} ,X4X4X4X4X4X4X4X<Xp - - O O O                     O 7 l.n.v.r.e.r.*.e.r.*.e.e.r.e.r.r.r.r.r.r.*.N.r.r.r.r.+.1.w.b.1X1X_ . O O O     O           O O O X @ * , , > i h d d _ uXnXvXzXrXqXuXkXaXfXfXgXvXvXgXfXuXqXm m m m m v v x 5               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXp ] 5X0X8X,X} [ ,X4X4X4X4X4X4X4X,Xp - - O O                   .     b n.eXh.e.e.*.e.e.e.e.r.v.e.e.r.e.r.w.r.w.r.e.w.r.w.w.1.+.w.z.1X1X) * X O O O     O           O O @ X * * , t h h i h h 1XvXvXzXhXwXwXuXaXkXfXfXvXfXfXfXdXwXU m m m m b v k 5               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXs ] 0X5X>X_ I _ ,X4X4X4X4X4X4X4X3X) p - O O O                     . &.eXqXr.r.*.*.e.e.e.e.e.e.e.e.e.e.r.r.r.w.r.e.r.+.w.r.w.w.O.z.1X1X_ O   O - O O O       O       O   X @ , , t h g g h h ' kXvXxXhXwXwXuXsXaXfXfXxXfXfXfXsXwXT m m m v v v v 5 .             X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXp ` ' ' f 7 7 _ ,X4X6X4X4X4X4X4X3X) - - - O O                 . O $ x.rXx.r.e.e.e.r.*.e.e.e.e.e.e.e.e.e.*.w.w.w.w.w.r.w.w.w.O.w.{ 1X1Xh O   . O O O   O O             X @ @ * * , e g h d h ` dXvXgXzXwXuXuXsXaXfXfXfXfXfXaXaXwXU m m b b v v v 6 .               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX, > e : < 7 j _ ,X6X6X6X4X4X4X4X5X) - - O O O                 . . b eXeXx.*.*.*.e.*.e.e.*.e.e.e.e.*.w.w.e.e.w.w.w.w.w.w.w.w.O.O.l.1X1Xh O . . O O                 O O X @ * , * , t g t h g f wXfXvXuXuXuXuXsXaXaXaXfXaXfXfXfXwX{ m m m m v v x 6 #             @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & # $ 1 7 7 ' ,X6X6X6X4X6X4X4X4X) p - - O O O                 # { BXeX*.*.*.w.*.*.e.e.e.e.e.0.e.%.e.w.e.w.w.w.e.9.9.w.$.o.O.#.| } 1X_ + . . O O O   O           O   O   * * , , t t i h g f } zXxXdXwXuXsXaXsXaXfXfXsXfXsXfXdX{ m m m v m v x q <               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & $ 2 r r 7 ' ,X6X7X6X6X4X6X4X3X) - p - - O                 . # l.eXn.*.+.*.w.w.*.e.*.*.e.e.e.%.e.%.e.e.$.9.w.w.w.e.9.$.O.O.#.{ 1X1X_ + . . +     O   O         O       @ * * , t g h g g g ` uXxXuXdXdXsXaXfXfXfXiXfXfXfXfXBX{ m m n b v v v x 1           O   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & 2 2 r r I ' ,X9X6X6X6X4X4X4X4X] - - O - O                   < x.yXx.*.$.*.*.*.e.e.*.e.0.e.0.e.9.e.9.9.e.e.9.e.9.9.w.r.t.w.,.{ 1X>Xs # . . + . O           O         X @ @ * t , g h h g h _ wXpXuXrXdXaXsXaXsXfXsXfXfXfXfXdXU v m b n v v x x 1       X   X   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & < 2 r I I ' 3X6X7X6X6X6X6X4X4X) - p - O O           .     . 7 n.BXM.*.+.*.*.e.e.$.e.$.e.e.w.e.e.$.w.e.w.9.$.$.9.e.t.j.E.E.5.,.` ' e = & # . @   O   O               X @ * * , t t h g h h _ 1XdXuXuXsXsXaXaXaXsXsXfXfXiXsXdXU m m m m V v c x 0 o   X     X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ & < 2 r r [ ,X6X6X6X7X6X6X4X6X4X) - - - - O O           .     I eXyXx.*.+.*.*.*.*.%.*.e.e.e.%.*.9.e.$.9.e.9.e.w.r.j.E.E.A.S.Z.<.@.K B q 2 $ .       .     O             @ * * * t t h g h h f } dXdXuXsXsXaXaXaXsXsXfXsXsXdXz.T m m v v v v c c l = * X X X     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & 2 < r I [ 1X6X6X7X6X6X6X6X4X4X) - p - O O             .   . I eXBXv.*.O.w.*.*.*.e.$.*.$.e.$.%.*.$.e.$.9.9.w.g.s.S.S.S.G.L.L.Z.i.1.O.n 6 & . .     O   O             X X X * , t t h g g h ` z.wXuXsXaXaXaXaXaXsXaXiXfXdXz.U m m m m n v c v c u y * * * X X   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & 2 e r I I 1X3X7X7X6X7X6X6X6X4X) p - - - - O         .   . . U BXyXx.*.O.$.*.*.e.$.*.*.*.$.e.e.$.e.$.$.w.w.g.s.S.S.a.S.K.~.(.~.I.D.a.1.=.j $ # .   O             O   X @ * * * > t g h g h f 1XwXwXsXaXsXsXfXfXsXsXsXdXz.&.U m m m V V v v c B u y t = * * o @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# > 2 2 e b I [ ,X6X7X7X7X6X6X7X4X<Xp p - - - O           .     k yXzXn.*.O.$.*.$.%.*.*.$.*.*.$.e.$.$.9.$.,.r.s.a.d.a.Z.J.^._.).).(.(.^.J.k.O.k 1 & .                 O O X X * * t t h g g s _ 1XwXuXdXsXsXaXsXsXfXiXdXqX&.@.M m F m m v v v c c Z y y y y = * + UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ & e r r e I [ ' 3X7X7X7X6X6X6X6X,Xp p p - O O           .     j eXzXM.*.=.$.*.*.$.%.*.$.$.$.%.$.$.$.$.*.w.u.s.i.u.S.F.~.).).).(.(.^.^.~.Q.g.=.k 1 + O . O           O   X * * * t > i g h h _ 1XrXwXdXaXaXaXaXfXiXuXqXl.&.@.K m S n V n v V n V u u y y y y *   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo : e r : r I [ [ ,X7X7X6X7X6X6X6X3X) p - - O O         .       7 x.zXyX*.+.$.$.$.*.$.$.*.*.$.$.$.$.$.$.*.w.u.5.1.s.F.K.~.).).).).^.(.~.Y.G.u.=.M j $ ; O                 X X X * , t h h g g f } wXdXsXsXsXsXsXiXdXx.z.l.&.U U m F n n V v F F V u u y y R y *   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ & e 2 & & r I I >X6X7X7X6X7X6X6X4X<X- p - - - O             . < l.BXyXx.=.*.*.*.*.$.$.%.$.$.$.$.$.$.$.*.,.;.O.O.i.D.L.U.(.).).(.^.~.P.W.t.,.G M k r ; O                 X X * o t t h h h e r z.wXuXsXsXsXsXsXwXz.l.l.&.U =.M m m V v c n G J Z u Z y y y y t O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & = & # # $ r [ 1X7XiX7X7X6X6X6X6X,Xp - O - -   O     .     O $ l.zXzXe.$.$.$.$.$.$.$.$.$.$.$.$.$.$.*.$.O.G n n J 7.H.U.^.(.).(.~.P.W.j.0./ T m k 7 a O                   X * * > t t t e e g { qXwXsXjXsXdXwXx.z.l.l.U =.U U F F n V v F J J A u y u Z y y t X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ o # & # $ $ r [ 1XiX7X7X7X6X6X6X6X4X) O - - - O O     .       . I zXyXx.&.$.&.$.$.@.$.$.$.$.$.$.$.%.$.$.o.G k l N W 3.A.I.^.).^.U.D.8.q.| | } U b 7 ; O                   X X * = t t t > > I &.x.BXiXsXdXqXx.l.l.&.&.@.L K n F F n n n F ..Q H Z u u u y y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  @ % # # $ < 2 [ dX7XiX7X7X7X6X7X6X4X,X- - - - O O O   O O O .   r BXzXn.*.$.#.@.%.&.&.$.$.$.$.$.$.$.$.#.X.n j 0 9 u N Q H./.(.(.U.Z.,.T Y } } I k 7 : O                 X X X * , > h > > h U l.qXwXdXuXqXl.l.l.l.U =.L K m F F n V V F J ..Q A Z Z N u u y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ . # $ $ < 5 I 1X9X7X7X7X6X6X6X6X6X4X) - - - O O O     O .     # l.zXBXv.$.#.@.$.$.$.$.%.%.$.$.%.$.$.#.X.n j 8 9 9 = 2 ~ H.)._.U.6.P S Y / Y b k 7 ; @ X                 X X X * = t > @ d &.x.x.qXwXqXz.l.&.&.U =.@.L m K F F n n n J ....W W E Z u Z Z y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX @ % $ $ < 8 b { qX9X7X7X7X7X7X6X6X4X] p p - - O O   O O . .   + b yXgXn.$.#.&.&.$.$.$.%.$.*.%.$.$.$.$.=.v j 5 & o .   2 B.].}.H.Q c l N b b k j 3 O O             O X @ X X * @ t , = , r l.l.l.l.l.l.l.&.&.=.@.@.X.M K F F F F v F ..;...W E W A Z Z Z i = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX X % $ < 2 5 k [ z.1X,X7X7X7X6X6X6X6X3Xs - - - - O O O O       O d l.gXeX*.%.&.%.%.$.%.%.$.%.$.%.%.$.@.@.n j 5 & % .     3._.[.H.A N 7 w z x j j $ + O                 X X * * * = > > > T %.&.&.l.&.&.&.&.@.=.&.L M K K n F F n V J ;.;.-.W ~ ~ E A E E i = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  X % 2 1 5 0 j U U } 1X6X7X7X7X6X6X6X4X>X- - - - - O O O O .   + : I BXzXx.%.%.&.%.%.%.%.%.%.%.$.%.$.$.@.m 4 1 2 o     X ~ /.{.B.H N l q x c j 3 #                 X X X X X @ * * @ > r &.%.&.*.&.&.@.@.=.@.=.=.X.L F F F G F D G -.>.<.Q Q ~ ~ W A W ~ E o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXO X * $ 5 6 q 6 v U } 1X9XiXiX6X8X6X6X6X4X) O - - - - O O O O . . + & x.vXrXv.%.@.@.%.%.%.%.%.&.$.$.&.$.@.M j 3 < .     X u V.'.3.S q q q j k j 1 .                 X O X X X o = o @ > T $.%.&.%.%.&.@.X.=.@.U @.=.F G F F F F F -.;.>.>.^ ~ :.~ W W :.3.u o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  X X $ 5 l l z b { z.qXqX7X7X8X6X6X6X4X6X,Xp - - - O O O . O + + +   I BXzXeX%.$.$.%.%.%.%.%.$.&.%.&.$.$.L j 4 < .       t 3.V.A w q 0 6 j j j < O     X             X @ * @ * * @ * b &.%.%.*.&.*.&.@.@.@.=.=.=.L M G F G F F ..;.<.<.:.2.2.:.:.~ ~ 6.2.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX X * % 5 l c B Y c.b.z.} 1X7X6X6X6X6X6X6X4X>X- - - O O O O O O O     - l.zXrXx.c.%.*.%.%.%.%.%.$.&.%.%.%.@.m j 3 .       X y y > & 0 q 6 j j 3 # O                   X X * o * o @ d &.0.%.%.%.%.$.@.=.@.X.X.X.L D G F G D F J ;.;.<.>.3.6.6.3.:.^ :.C.6.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * 2 x v C c.c.b.x.{ } 1X6X8X6X6X6X5X6X3X) p - O O O O O .   O . O 7 qXzXhXx.l.%.l.%.%.%.&.%.&.$.%.%.&.m j 3 #   X         + e 7 q j j j <     X   X X         X X = * o o o , T 0.%.%.%.*.l.%.@.$.=.X.X.G G G D G F F J ;.<.<.<.2.6.6.6.3.:.:.4.D.6.= UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * 9 N S T c.c./ %.&.{ } 9X7X6X6X6X4X6X5X>X) -   O O O O O O O .   O r BXgXhXn.e.%.%.%.%.%.%.%.%.v.v.l.U k 4 $ .       O @ : 5 5 6 l j 4 $   X   @ X       X X   o o * * * @ S %.c.*.l.c.%.%.%.$.@.$.=.L G H G G G F G -.<.i.4.2.6.B.7.6.2.3.4.Z.L.3.X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * = N T / / ,.y.*.&.=.U 1X7X6X7X6X6X5X4X,X] ) O O O - O O O O . O . ; f eXvXrXx.%.%.%.%.%.%.%.l.v.x.v.&.m j 3 #       . & w 5 5 6 6 j 1 .   O   X   @ X @   O X o * o , & b &.%.%.%.%.%.l.*.%.@.@.=.=...G G G G F G ..<.i.5.2.2.C.C.7.6.6.2.C.D.L.E X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * X * Z / / ,.,.,.,.,.$.=.U 1X6X6X6X4X6X3X,X>X' p p - O O O O O O O O + ; r z.zXwXv.l.%.&.&.%.l.x.b.n.l.&.M k 7 < . O   . & 8 0 6 l j j $     o   X   X O   @   o X o & & b &.$.$.#.#.%.%.%.%.$.@.X.L G J J G G G D J <.i.5.5.6.C.C.C.7.6.6.7.S.P.A.u . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX @ * * i ! / ,.! ,.! ,.,.w.=.[ 9X6X6X6X6X3X,X>X' ) a p O O O O   . O . + ; ; 7 l.eXn.v.%.%.%.%.c.qXeXn.%.@.@.m 7 1 #     . < 5 7 q j k 4 #         @   X   .   o     X > b @.$.$.$.@.#.$.%.*.*.$.X.L ..G G J G J F J <.5.i.4.5.C.Z.A.C.C.6.7.C.D.I.B.y @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ X * t u ~ ! -.:.,.3.:.y.j.r.=.I ,X4X5X6X3X,X>X' ] ) a - - O O   O O ; O + ; - < U x.eXx.l.%.%.n.rXrXn.&.=.@.=.j 4 2 % * # < 7 7 l x k 1     X   . . . O X @     X   w T $.$.@.@.@.#.%.%.$.%.%.X.G J G J G G J G J <.p.p.5.4.B.A.A.A.C.B.6.C.S.L.~.3.y @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    * * t E ~ :.,.;.,.,.t.E.M.e.M [ 1X3X9X3X,X<X>X] _ ) a ; O O O   . O ; O - O O $ I { eXn.x.l.eXuXuXqX&.&.&.U m j j w y i g b b b x 3 #       .       .         > Y @.&.@.$.@.@.#.@.&.%.#.o.o...J G J J G J G J <.p.p.5.7.C.C.D.D.D.C.C.C.D.K.~.R.W e UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  X * t E ^ 3.:.,.,.8.j.E.*XM.1.K I >X,X,X,X>X' ' ) ) ) a ; ; - O   O O O O + ; ; ; d I { b.z.rXhXkXuXn.l.l.&.=.k v S S ( Y { I b j < O @ .   .       . . & > Y T &.$.$.@.@.@.$.@.&.$.o.o.X.P ..G G G J G G -.4.p.p.7.7.p.S.D.D.A.Z.Z.A.D.P.~.^.C.y % UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX   X t E ^ 3.2.,.2.t.E.E.W.j.j.+.v I ' >X>X' ' ' _ _ _ a a p ; O O O O O ; + - @ ; > > d } b.wXrXrXzXhXwXx.%.&.M v S R Y Y Y Y b 4 # . + o   . . . . & r m U &.$.$.$.@.o.X.@.$.@.@.@.X.G J G G J J J J J -.5.p.p.p.p.C.D.D.L.D.Z.A.D.R.L.U.^.~.2.t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo X @ t E y.y.y.8.t.t.E.*XE.E.j.s.+.=.I _ ' _ _ _ _ ) a a a p ; ; O O O O O O @ - ; , , > , h ` } z.z.qXwXqXqXz.&.n k u i S b k j < o o % @ & & > e S T &.$.$.$.$.@.$.@.@.o.X.X.X.L J J X.G J J G J J ..8.p.C.p.p.Z.A.D.L.D.D.D.D.A.R.@XQ.U./.L.W t , UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe h e > t y Z ^ y.t.t.t.E.*X*X*Xj.B.s.j.+.=.k f f ) _ _ _ _ a a a ; ; ; O O O O O ; @ ; ; : > ; > > > h g Y [ } } } { b j l 8 w j j 4 < < 5 6 w b m T T %.%.$.$.$.$.@.X.X.X.o.X.X.X.G G J L J J ..G J ..,.5.p.a.Z.Z.A.R.P.I.I.L.D.D.D.A.!.!.=X!.Q.*X| ) ` _ ` UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXy e i g Y  .` g Y i i w w u N ! y.y.m.%XZXZXZX%Xj.p.s.s.s.g.=.k r f a a f ) a a a : + ; + O O O O O O + ; ; ; ; : > > ; , : & : r r Y r j j 3 6 k k k k n m m L #.%.0.%.%.%.#.@.#.o.X.o.L L o.G G G J G L G G G F J ;.7.a.a.p.p.Z.D.U./._.^.~.P.D.C.C.V.%X%X%X%XIXtX0X2X2X2X2X0X2X2X . .i = = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> e e g Y g Y Y Y Y Y Y Y S S A m M C S Y | | tXtXIXNXIXZX*X*Xj.E.A.s.g.=.k b r r a r a a : : : + + O O O + + O + + , : : : : : : & # & $ & 2 & 5 j k F G v k =.+.O.$.@.@.X.L &.#.&.o.L o.G ..X.G L G P J G H G ..J J J J o.4.s.a.a.a.Z.Z.H.$X{..X.X`.D.6.2.:.Q ~ ! / / | ( } 2X2X2X2X2X2X2X2X2X| R i y 9 = = * o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXi e g g i Y Y Y T Y { l.&.l.l.&.@.&.l.&.{ &.l.{ z.z.z.b.b.IXlXIXyXIXyX*XW.W.G.u.O.M k 7 r r : : : : + : # + O . O . . . + . . + # # & & & # # % = $ 2 6 k O.1.;.O.M =.1.1.1.,.L G M L L L L G G G G G G ..J G G H G G J J ..,.4.p.Z.Z.p.i.d.R.$X_.{..X:X@X8.-.H H S N N C N u w r e d  .g g `  . .g Y u w y 9 9 9 = = = % o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e e Y Y m S K I U { z.qXx.x.BXx.n.qXBXx.qXqXx.qXqXqXx.eXn.b.n.b.tXIXlXyXIXeX%XE.G.G.d.N.=.k j < : + : : + + + + + + . O + . . . . . # . # # % & & 9 2 & 2 k =.u.a.5.1.O.M O.+.1.+...G F v F G F G G F G G G J G J G G G G G ..>.6.p.C.a.a.a.a.S.R.(..X:X&XE.,.W D C N N z w w w 9 = & % % * % < & t * = % & % & & % % % % % o = % = , = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & e 9 8 7 b Y U &.z.z.BXBXgXgXgXvXgXgXgXgXgXgXzXvXNXzXxXxXgXzXzXyXeXeXqXb.eXeXeXn.m.t.t.G.G.G.s.O.=.k j 1 < # + + + . . & + + + . . . . % . # # % % 9 9 w w 6 k M u.f.a.i.5.u.O.=.O.N.u.u.<...G n F F F F F L F F G D G J J -.;.4.8.C.C.p.i.p.a.d.D.L.~.'.Q.t.,.E S C S S 7 q 0 9 9 % % . o         .   * o   o . .         . . . . . % = = = t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% : e 8 w x N k M &.wXgXvXgXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXvXMXMXMXvXxXkXxXhXzXrXwXqXz.b.l.q.o.-.,.s.F.F.s.+.M k k 5 8 & & & & + # % # & % & $ % % % % = 9 9 u Z C G =.N.f.F.S.p.5.i.s.O.=.+.u.i.a.p.5.>.;.G G J ........Q ,.,.1.1.8.p.Z.C.Z.C.C.a.a.a.F.P./.!.8.P c l l 0 w 0 2 9 e & = X o X   X X                                   .   . . % o o y R R i > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 $ 1 4 k m { x.BXgXvXvXvXnXnXcXnXcXnXnXcXnXnXcXcXcXcXcXcXvXvXvXbXxXxXxXxXfXkXkXhXhXhXqX{ &.@.=.G O.1.S.Y.F.d.u.+.=.n v 4 < 2 2 $ & < & 9 w w w 9 9 8 8 w N H H ..+.u.Y.K.F.D.Z.j.Z.s.u.+.O.N.u.u.s.A.Z.s.i.5.5.5.8.5.p.8.s.8.A.s.a.a.a.a.p.S.S.F.F.F.L.A.>.H x l 6 0 2 = = % % o % o o o     X     X                                             . o i R R R t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & & 2 2 1 7 k U z.gXvXcXcXcXcXcXcXnXnXnXnXnXnXnXnXcXcXcXcXnXvXvXMXvXvXvXbXxXxXxXxXxXxXxXfXkXhXqXl.U T L K G O.i.Y.K.J.f.N.O.=.n k j x l 0 8 w u u Z Z A N w z B D -.1.u.d.T.(.^.L.S.S.A.Z.d.S.u.+.+.N.u.k.d.d.d.a.p.a.Z.a.p.a.Z.Z.S.S.S.F.D.S.S.S.S.L.P.L.A.2.D j 6 5 2 & & = o o o o o o X   .   X   X       X X                                         o * t R R R R t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & $ < 5 1 3 U wXgXgXcXnXcXcXnXnXcXnXnXnXmXnXnXnXcXnXcXcXcXnXcXvXvXvXbXbXxXxXxXxXxXbXxXkXxXkXkXkXzXeXz.{ &.@.L M G ,.s.Y.I.K.G.a.u.+.+.O.O.F F D H W :.2.2.Q ......O.N.k.G./.(.{.{.P.F.G.Z.Z.Z.S.f.f.N.N.N.N.i.a.i.f.d.S.f.S.d.d.S.S.S.D.D.K.P.P.P.K.P.P.C.2.H v 6 1 2 % = % o * o X o X o X   X     X           X                                               o t y y y R t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 1 3 3 3 j BXgXvXcXcXcXnXnXnXnXnXnXmXnXnXnXnXnXnXnXnXnXMXMXMXMXMXbXMXbXbXxXbXxXbXxXxXkXxXxXkXkXaXhXzXrXx.l.l.@.L M k G ,.A.^.(.P.K.F.S.f.u.u.N.i.a.p.i.i.i.i.5.<.u.a.G.F.P.~.(._.{.~.Y.D.Z.a.d.S.f.F.F.f.u.1.N.N.u.k.f.f.F.f.S.f.f.D.R.U.U.R.~.(.).~.A.2.L c l 2 2 % o o o o o o o         X                                                                       . o * = t t y t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 2 < 1 4 j z.gXvXcXnXcXcXcXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXmXmXMXGXMXMXMXMXMXMXbXMXbXbXxXxXkXkXkXkXkXkXhXrXrXeXn.x.x.&.@.L n n G 8.R.I.^.~.P.J.S.F.F.F.S.d.i.i.i.p.C.Z.D.U.~.~.I.I.^.{.{._./.S.a.Z.S.S.F.F.J.J.F.S.i.u.u.u.u.a.a.a.d.f.F.R.~._.{.}.[.(.A.4.J b b b 2 = o o o o o o X   X X                                                                                 X   . X * t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: > 2 2 < 1 1 I BXvXcXvXcXcXcXnXnXnXnXnXnXnXmXnXnXnXnXnXnXmXJXJXJXKXJXJXKXLXLXLXCXVXVXLXLXbXbXbXbXxXkXaXaXkXrXBXrXeXeXn.n.v.l.@.=.M v K ,.A.U././.I.P.K.J.F.G.S.a.B.C.D.U.^.(.(.^.^.I.I.I._._._.(.D.S.d.S.S.S.F.J.J.J.P.K.D.Z.p.7.p.C.A.A.H.U./.].}.|.[.H.2.J m m b r & & o o X o . X o     X                                                                                           X * t R t t @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe e 2 2 6 3 7 wXgXcXcXcXcXcXcXnXnXnXnXnXnXnXnXnXnXnXmXmXJXVX-X-X-X-X-X;X-X;X:X:X+X#X#X#X#X:X:X=XVXZXNXNXkXaXsXhXeXwXx.n.n.x.x.c.*.%.@.M v v P t.R.U.I.I.I.P.J.J.L.L.U.U.(.].].].).(.^.~.I.P.^._.]._.U.S.S.S.F.F.J.K.P.P.~.~.~.I.U.U.I.^._.].].[.}.|.|.R.7.Q c b I I f r % o X .   X X                                                                                                       X X t t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d d e r 5 4 I BXvXvXvXcXcXcXcXnXnXnXnXmXnXnXnXmXMXJXCXVX-X:X=X+X+X=X+X#X#X#X#X#X#X#X.X#X.X.X.X.X.XoX+X&X&X*X*XM.rXwXeXeXx.n.x.x.v.%.%.$.X.G n v V ! E.W.I.I.I.P.P.~.^.(.(.].{.[.[.).).(.^.I.P.I.(.).]./.D.S.D.F.F.J.K.P.I.~.~.I.^.(.).].[.}.}.}.|.|._.C.;.H K b b r : : & o o . .   X                                                                                                             * * t t t t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d e r 3 j j } gXcXvXcXcXcXcXnXnXnXnXnXnXnXnXnXmXJXLX-X=X+X#X+XoX+X#X#X+X#X+XoX+X#X#X#X#XoX.XoX.XoX.X{.{..X'./.U.W.M.eXeXn.n.x.v.l.c.c.%.%.#.X.G n v c ( t.!.Y.P.I.I.~.^.(.).].[.[.[.].).(.^.I.I.I.(.).].^.L.F.L.F.F.J.J.P.~.~.I.~.~.(.).].[.}.}.|. X'.8.! F B b [ [ f : o o o                                                                                                                         X t t t t t @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e d e 5 3 j wXvXvXvXcXcXcXcXnXcXnXcXnXnXnXnXmXJXVX&XOX+X+X+X+XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX'.oX_..XoX'._.'.XXXXXXQ.W.j.n.x.x.v.v.%.%.%.%.$.$.X.M v v S ( y.%XW.U.~.~.^.).).].[.[.[.].).).(.^.^.^.(.].].(.I.I.I.J.J.K.P.I.~.I.I.I.~.(.(.].[.}.|._.6.,.P P v v b [ _ a . X .                                                                                                                             * * * * X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 2 r j I dXgXvXgXvXvXvXcXcXnXcXcXnXnXnXmXJXVX&X+XoXXXXX+X+XoX+XoX+X+XoX+XoX+XoXoXoX#XoXoX.XoX'..X`.'..X'.`.`.`.XXT././.T.W.h.n.x.c.%.%.%.%.$.o.O.X.M v x x Y / y.E.Y.~.(.].).].[.].[.].).).).).].).].].].^.~./.^.^.~.~.~.~.~.I.P.U.~.(.).[.}.[.$X2.P K K m v I f _ s @     .                                             X   X                                                                                         X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. # & < < 1 b dXvXvXvXvXvXvXcXcXcXcXcXnXcXnXMXCX&XXXQ.OXOXXXOXXXXX+XOXoX+X+X+XoX+X+X+XoXoXoXoXoXoXoXoXoX'.oXoX`.`.`.XXT.T.`.T./.U.K.h.c.l.%.9.%.$.$.$.#.o.L n k c S R S ! 8.D.{.).).).[.[.].[.].].].].].[.[.[.].~.P.U.^.^.(.^.~.~.~.I.I.~.~.^.].}.[.A.>.! T T S v b I _ s @ o                                                     X   X X X                                                                                     @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo # $ 1 4 3 k uXfXgXgXvXvXcXcXcXcXMXcXcXcXmXCX*XOXOXOXOXOXOXOXOXOXOX+X+XOX+XOXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX`.`.`.XXXXT.T.T.T.`.U.U.U.K.j.e.%.%.$.$.$.o.#.@.o.G v k x z w u Z Q A.{.).].}.}.[.[.[.[.[.[.[.[.].[.].~.L.I.^.(.(.(.(.(.^.(.^.^.(.).[.[.C.Q H D F m v j r d : O @ . O                                               X X         X                                                                                         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  . & : 7 k k m wXfXvXvXvXvXvXvXvXvXvXcXcXcXLX&XOXOXOXQ.OXQ.OXOXOXXX+XOX+X+X+X+X+X+X+X+X+XoXoXoX+X+XoX+XoXXX+X`.`.XX`.`.Q.Q.T.T.T.T.T.T.U./.P.G.r.%.&.#.#.o.o.o.o.G F k 6 l 0 9 9 2 B C.{.}.|.|.}.}.}.}.|.}.}.[.].].).~.P.U.^.(.).).].).)._.].{.{.[.).7.D V z x x v k 7 & o .                                                   X X X X X X   X                                                                                             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. . o : I I U U x.fXfXfXvXvXvXvXvXxXvXcXnXMXVX=XXXQ.OXOXQ.OXQ.OXXXXXOXXXOX+XOX+X+X=X+X=X=X+X+X+XOX=X+XOXOXXXXXXXQ.XXT.XXQ.T.T.Y.Y.T.Y.T.L.Y.P.K.K.G.r.$.#.$.o.o.X.o.X.G k 6 l l 8 9 2 8 A $X|.|.|.|.}.}.}.}.}.[.[.].].).U.J.P.~.(.(._.).].).].[. X|.|.B.C B N c c k k 6 % .                                                     X X X X   X X   X   X                                                                                           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & : I U [ } z.gXfXvXvXxXvXxXvXvXvXvXMXJX&XXXXXXXOXQ.Q.OXXXOXOXOXOXOXOXOXOX=X+X=X=X=X=X=X=X=X=XOX+X+X+X+XOXXXXXXXT.XXXX`.XXQ.Y.T.Y.Q.Y.Y.Y.Y.L.F.J.F.1.$.O.$.X.o.X.X.G F l l 6 0 9 9 9 i 3. X|.|.|.|.[.}.}.[.].].].].).I.L.P.~.^.(.(.(.).].].}.|.|.}.3.S S m S V k j 2 o   .                                                     X X X X X X X   X   X X                                                                                         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% $ : f [ [ } } uXfXfXfXxXxXvXxXvXvXvXvXCX+X`.XXXXOXXXXXOXQ.XXXXOXOXOXOX=X=X=X=X=X=X=X=X=X:X=X+X+X+XoXoXoXoX'.'.`./.'.'./.`.`.`.`.T.T.T.Y.Y.Y.Y.G.F.Y.Y.S.1.;.o.o.L ....L K c j 6 0 w y 9 y A '.|.|.|.}.[.}.[.[.].].].).(.P.J.K.I.~.^.^.^.(.].[.}.|.|.H./ Y Y Y Y m k 2 %                                                         X X   X X X X X X X X o X X X X X X                                                                               @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & & 7 [ } U } uXkXfXxXfXxXxXxXxXvXbXMXZXOX'.XXXXXXXXOXOXQ.Q.OXOXOX=XOXOX=X=X=X=X=X-X=X&X=X=XOXoXoXoX'.oX_.'.'.'.'.'./.`.`./.`.T./.`.U.T.T.Y.Y.F.F.Y.G.F.F.G.1.o.o.X.X.X.G G v j l q u y y 9 y V.|.|.|.|.[.[.[.[.[.].).].).K.F.K.P.^.^.(.(.(.).].|.|. Xy.| | Y Y U b k 2 .                                       . . .   . .   o   o . o . o X * X X o X X X X X X X X X X                                                                               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo . o a j I [ { qXsXfXfXxXfXxXxXxXfXxXvXCXoX'.+XXXXXXXQ.XXXXXXXXOXOXOX&X=X=X=X&X-X&X=X=X=X=X=X=XXX_.)._./.XX&X&X=X&XQ.OXOX&X&XQ.Y.U.P.U.~.~.~.~.I.P.K.Y.G.F.G.G.i.O.X.L L X.G G v j j x u u u y 9 ^ |.|.|.|.[.].[.}.[.[.].].).D.F.K.P.~.~.^.(.^.).[.}.|.@X| { Y Y Y m b b r :                                       . % o % % % % % % % % % = % = = o X o X   X   X X X X X X X X                                                                             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo o . & 7 b U [ qXsXsXfXaXxXxXxXxXxXxXMXCXoXXXXXXXXXXXXXXXXXXXXXOXOX&X=X=X=X=X&X=X=X=X=XOXOXOX&XXX/.`.Q.Q.!.ZXZXNXIXIXNXNXZXZXZXZXZX*X*XQ.`.U.I.I.I.U.Y.Y.Y.G.G.G.G.<.X...o.J L G F k k z A E Z u 9 Z _.|.|.}.[.}.[.[.].].}.$XE 9 :.L.~.~.^.^.^.(.).[.}.|.@X( Y S S S S m b f p .                         . . . % . % o = 2 2 8 2 0 0 0 w q 0 w 0 0 0 8 2 % % o = o o X X X X X X X X   X                                                                       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. # & 1 b b [ } sXaXsXfXkXfXfXxXxXxXxXVX.X'.XXXXXXXXXXXXXXXXXXOXOX=X=X=X&X=X&X-X&X=XXXXX@XQ.Q.&X*XZXNXhXlXlXlXkXkXkXkXlXkXkXkXlXlXkXkXhXhXNXNX*XW.R.W.A.G.J.F.F.F.W.1.O.O.L G L G G V v V A ~ E Z y Z _.|.|.}.}.}.[.].).).H.u     X A A.~.I.^.^.(.).[.|.}.V.S w w u b z k b r ; O                   X . % % 9 9 9 y w N z c V V D D H J -.-.J H H D D C B z N w 8 = % o .   X X X X X X X X X                                                                   O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. . # : 7 b U U dXsXsXsXaXaXfXkXkXxXfXVX'.oXXX`.`.`.`.XXXXXXXXXXOX=X=X=X&X-X&X=X&X=XOX`./.`.*X*XyXlXbXlXlXuXtX2X2X2X2X2X2X2X2X2XrX2X2XrXlXlXbXxXbXNXyXM.E.D.F.F.J.F.G.s.1.O.G L G ....G n D E ~ W Z u E $X|.|.|.}.|.|.}.].V.= X     O O y 6.U.^.).)._.[.}.}.H.u 8 w w l j j j r ;           .   .       X = = 2 q z B D J :.>.>.<.2.4.7.7.7.8.6.8.t.8.2.Q Q H B c z 0 2 # o o     X   X X X X X                                                                   @   UXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUX. . # # r j b U qXsXsXsXaXaXkXaXaXxXfXZX'.oXXXXX`.`.`.XXXXXX`.XXQ.OXOX&X=X&X-X&X&X=X&XQ.T.Q.ZXNXkXkXkXlX2X} ` ` g g  .g g h h ` g f I g ` } 2XlXlXkXkXjXjXrXeXj.s.d.F.F.Z.1.O.o.M G ;.O.G n G Q ^ W E E ~ _.|.|.}.[.|.{.V.~ * X             * E V.^.(._.}.|.|.V.w 9 9 w w q j 4 2 . .     . # .         9 Z Z N c n F ..:.6.A.A.B.B.7.C.B.C.B.B.B.E.%XV.E.V.8.2.Q J H V z q 8 = o o   X   X X X X X X                                                                   UXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUX. . . $ 7 k b U dXsXsXsXsXaXaXkXxXaXyX~._.XXXXXX`.`.`.`.T.XXQ.OXOXOX&X=X&X&X=X&X&X&XT.Y.ZXhXjXkXkXlX2X` s a e 9 = = t t t * t * * * * % o s ) `  .] 2XkXkXpX9X1X} 0.S.S.Z.g.;.O.G O.;.<.=.G J :.3.~ W E :.$X|.|.|._.V.Z .                   O   = E B./.[.|.|.H.u 2 2 2 5 5 j 4 < . . . . . # . #   o y W 7.5.2.>.>.4.7.A.A.E.A.B.C.B.B.7.B.7.8.B.8.E.E.E.E.E.B.E.V.6.4.:.J B w 2 & % .         X X X                                                                     UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXo . . . < 4 k U qXiXsXsXaXaXaXaXkXaXyXT._.oXoXoX`.`.`.`.XXXXXXQ.Q.&X=X&X=X=XOXOXQ.&X&X*XNXjXjXlX2X} ` d + + + & & = > = > = = * , t , > > = > h h h s _ ` } } } ' ' } c.1.<.5.,.O...;.1.<.O.G -.3.3.~ W W ^ $X$X$X^ i X           UXUXUXUXUX      O   = S ^ V.$XV.w # & 2 8 6 j j 3 # . % . % . % # 9 A Q 4.7.C.7.7.7.B.A.E.A.E.B.7.7.8.6.6.6.6.7.8.B.E.E.E.E.E.E.A.E.A.B.8.6.Q D B q 2 = % X X .   X X X                                                                     UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX. . . . $ 1 j k U dXiXsXsXiXsXsXsXkXzXQ.'.`.XX`.`.`.`.`.`.`.XXQ.OXOX=X&X=X&XOXXXXXU.W.yXkXkXjX2X` p . . . : + o & @ + @ , & @ @ , = , t , & @ > , h h h ; ; p > : a _ [ ' U O...O.+.;.1.5.1.O.O.;.6.3.:.~ ~ ~ ^ ( =               UXUXUXUXUXUXUX          X * = Z E 9 % $ 2 w l c k 4 $ # . % . % % 9 W 2.4.6.C.7.7.7.6.C.A.A.E.B.7.6.6.4.4.2.6.6.8.8.8.8.B.V.E.E.V.E.B.E.E.B.E.B.>.J C l 8 % . .           X                                                                   UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX. . . . < 3 j k } dXdXdXuXdXsXsXsXfX*X`.XXoXXX`.`.`.`.`.`.Q.OXQ.OX&X&X&X=XOXXX`.U.Q.hXkXkXlX2Xs ; + # # # + # . + + + o , @ ; + @ , , , , > % , s h h h > > & # # : r _ ' ' U G =.;.u.i.1.;.+.;.4.C.4.>.:.:.A X             X UXUXUXUXUXUXUXUXUXUXUX            O @ = & < 5 l z V n j < # # # . % 9 H >.2.4.4.6.B.B.7.6.7.C.B.E.B.6.6.4.4.2.<.2.4.6.6.6.B.8.B.E.V.E.E.B.E.B.E.E.E.B.2.Q V z w 9 % o       X                                                                       UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXo # . . & 1 j k U qXwXwXwXuXuXuXsXsXM.I.XXXX`.`.`.`./.U.`.XXXXXXOXQ.OX&X&XOXXX/.U.*XlXjXkX2Xf   . . o + + + + +   O . O O .   + O @ , , t h > , : , s s h > > = & & 2 w f _ ' ' U J 1.p.d.1.+.;.5.C.C.6.2.2.:.~ =           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          O & 8 0 N A H ! J M j 2 9 = 9 w D J J :.:.2.4.6.6.6.6.6.B.B.B.B.6.6.4.6.4.2.4.4.6.6.6.6.8.8.8.8.8.V.t.B.B.B.B.E.V.E.V.:.J D N 9 * o                                                                             UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX& % . . < 4 j I { qXqXqXwXwXwXwXuXrXW./.XX`.XX`.`.U.`.U.`.XXQ.XXQ.&X&X&XQ.XXI.P.W.lXkXlX| >   . & . + . + O O O O     O   O   O O - @ t , t e > : : s s s s > > & 2 9 9 2 f [ ' >XT 4.a.i.u.N.i.Z.A.C.C.6.8.y.y.i o     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      > 9 w u A ! ,.,.:.O.M v z Z Q :.:.Q -.:.2.3.3.2.3.4.6.6.6.B.B.6.6.4.4.2.2.2.2.2.6.8.6.6.6.8.8.V.8.B.B.t.V.E.V.8.E.B.E.7.>.P D N 9 =     X   X                                                                     UXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUX@ & % o # 1 4 k U { z.z.qXqXqXtXeXwXM.Y.`.Q.T.XXT.T.T.U.T.`.Q.OX&XQ.Q.&X&XOXU.I.*XlXkXlX} p + % # # + + O . O .     O     O   O O - - , > e t g d > > , > s d s : > : & & 2 : f _ ' [ ;.i.k.u.u.a.D.D.H.!.%XIXm.| S > o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i i S N N A ! ! ,.>.-.O.O.=.;.8.7.7.B.6.6.6.6.6.6.2.2.4.6.6.8.8.6.4.4.4.2.4.4.4.4.4.4.6.6.6.6.6.8.8.t.B.B.8.B.t.B.B.E.V.B.B.3.-.H N 9 % .             X X X                                                           UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUX. % . . $ 3 j k U z.z.z.z.z.qXqXeXn.G.T.Q.T.T.Q.T.Y.T.U.T.Q.Q.OXQ.&X&XQ.Q.T.I.E.kXjXlX .p . # + . + . O O                     O O O ; ; & e d i g g e e e d > e e = 2 9 2 8 1 7 b b =.N.k.f.k.s.a.Z.C.E.%XlX0XlX|  .i > %   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i g ( Y S P S P H W ! ,.;.<.1.N.f.G.G.D.R.H.A.C.C.C.V.6.6.2.3.4.6.6.3.2.2.2.2.2.2.2.3.8.3.6.4.4.2.4.4.6.8.8.8.8.8.6.V.8.8.E.V.E.B.8.-.D N = o   X   X         X                                                           UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUX@ . . . . $ 4 k U { { l.z.l.z.z.z.z.j.Y.Q.Q.Y.Y.T.Y.U.U.U.Q.Q.&X&XQ.Q.Q.Q.XXP.W.rXjX2X} :   . + + + + O O                     O O O ; : a d d g Y S g g e e e e e e u w q x v M =.N.N.f.f.f.f.u.+.;.-.H T b.2X2XtX| ( w u y e % @ UXUXUXUXUXUXUXUXUXUXUXUXUX@ e g Y ( Y ( S S S N B C A ~ Q ;.5.Z.J.F.F.J.J.F.F.D.H.H.H.H.A.C.B.B.6.6.2.>.2.>.2.2.2.2.6.4.4.2.4.4.4.4.2.4.6.6.6.8.6.8.8.8.8.V.t.B.8.B.2.H V 0 % o X             X                                                             UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUX        # $ 7 b U { l.l.{ l.z.z.z.x.W.T.Y.Q.Y.T.T.T.U.Y.T.Q.&X&X&X&XW.Q.XX`.Y.tXdX2Xf + . # . . .   O                         O O @ ; : d f ` Y  .g g R S u u w N A H J ..+.N.N.k.f.F.F.J.F.u.+.M m k 6 j j b Y I I 7 0 8 w 9 y e > UXUXUXUXUXUXUXUXUXUX& & e i S S S K S v l x k z v c v n ..;.$X).I.P.J.F.F.F.F.L.R.H.H.H.H.H.H.H.C.7.2.2.2.<.>.2.2.3.6.2.2.2.2.2.4.2.4.4.4.6.6.6.6.6.8.8.8.B.B.B.B.8.:.V x 8 = o   X         X                                                             UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX.         $ < j M U U &.&.l.l.l.l.x.h.Y.Y.Q.Y.Q.Y.Y.Y.Y.L.Y.&X&X&XW.&XQ.T.XXU.m.2X` e & % # + . + O                             O O ; : e r f Y Y R Y S S S N B D G ;.N.u.k.f.G.F.J.J.J.J.J.i.$.+.M j 7 5 2 2 < 1 1 < < 3 < 2 9 u S R i > UXUXUXUXUXUXUX@ e 7 w w 7 c v k v k k v n v n F ..<.;.v 2._.[.).~.F.F.F.S.D.F.L.L.L.L.L.R.R.D.H.C.C.6.4.2.>.2.6.6.2.2.2.>.>.>.2.2.2.2.2.2.4.2.3.6.3.6.8.8.B.8.B.8.Q c q 2 o   X X       X X X                                                         UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXX       . $ 1 k U U &.&.&.&.&.l.l.l.s.Y.Y.Y.W.Y.Y.Y.Y.Y.Y.Y.&X&XQ.W.&XQ.Y.T.A.} ' s % % + . . O O                           O O O + : : d f Y Y Y ( A P H J ..;.N.i.f.G.F.F.K.K.P.P.P.P.L.t.q.O.1.O.3 8 2 # # # # $ # $ 1 1 1 2 w R R R i e UXUXUXUXUX> 9 w r 0 3 7 j j k k m U K K F G -.S.L.;.n D 3.$X[.).^.~.U.U.L.D.L.F.L.L.F.L.D.D.L.R.R.H.A.C.2.>.2.2.2.2.2.2.>.>.>.>.>.2.2.2.2.2.2.2.4.2.3.8.8.6.8.V.3.K x 5 % X X   X       X X               O                                           UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUX        O . < 4 k =.U U U &.&.&.l.l.w.G.T.Y.Q.Q.Y.Y.Y.Y.Y.L.Q.&X*X*X&X&XW.Y.T.v.' f > & % % +   O                               O O + : e e Y ( ( ~ ! Q ;.1.N.k.f.G.J.P.I.P.P.P.P.I.P.P.Y.E./ U +.u.5.x & % # % . . . . . # < 1 1 0 i i i i e & UXUXUX> 9 r w 5 < 1 1 j k k n U m K F G D 5.P.D.H v G H 3.$X].).).(.(.^.~.I.R.D.H.F.F.F.J.J.R.D.R.H.H.C.6.3.3.2.2.>.>.>.:.:.>.>.:.>.>.>.2.2.2.3.2.2.3.3.2.6.8.8.Q N q 2 o X   X     O * X X           O   O O                                       UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo * , s h + 1 4 v U @.U @.&.&.&.&.l.u.G.Y.Y.W.Y.Y.Y.Y.G.Y.W.Q.VX&XW.!.Q.Q.Y.E.} ` d & @ . . .                               O O O ; + e e i E ~ 3.:.<.1.u.d.G.K./.~.^.~.~.I.P.P.I.P.I.R.A./ U O.1.a.a.B % # % # # .   .   .   # < 1 & o o X X @ @ @ & 2 8 8 < 1 1 1 4 k M M m K K n V J >.D.~.6.u l n H W ^ B.).).(.(.(.).).(././.^.U.L.L.F.D.D.D.D.H.H.H.A.6.3.:.:.>.:.-.>.;.>.;.;.:.>.>.2.2.2.2.2.2.2.2.2.2.6.:.D x 0 % o . X X     X X X         O O   ; + + .                                   UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUX: ] <X<Xh : 3 4 b M U @.@.@.&.U &.*.d.Y.Y.G.Y.W.Y.G.Y.Y.G.W.*X&X*X*XW.Y.Y.W.b.` ` : o % . +                                   O . + > i i H :.6.i.i.s.G.U.(.].).).(.(.^.~./.I.I.I.I.P.8.P Y @.N.d.D.S.Q % . # . .               . $ $ .         o & 9 2 2 < 1 3 3 7 k m m K G F V B D -.Z.P.L.W 9 8 x n C Z E V.~.).(._.).).].{.[.[.{.).(.U.D.d.Z.S.L.R.R.H.A.6.:.:.-.:.-.-.-.:.-.:.>.:.>.:.>.:.2.2.2.2.3.2.2.2.3.Q c q 2 . X X X X   X @         O O ; : a a a ) p O                                 UXUXUXUXUXUX",
+"UXUXUXUXUXUX, ] 5X5X<Xh $ 3 j m U L L @.@.@.&.@.w.G.Y.Y.Y.G.W.Y.Y.G.G.W.&X*X*XW.W.W.Y.Y.%X} f d & # .                                       O + % e u H ..1.i.a.D./.{.|.|.|.].].).(.~.~.~.I.I./.U.A.! P T O.i.F.F.Z.;.< . . . . .               . # # .         o 2 2 < 1 3 3 4 k n m K F V V V D J 5.K.K.p.Z 9 & q F D A R  .E.'.).(.(._._.).].[.[.}.}.|.{.U.D.S.S.Z.D.D.H.A.6.:.-.:.-.:.-.:.:.;.:.;.:.>.>.>.>.2.>.>.:.:.:.>.:.:.D l 5 &   X         X   O     O ; a ) ' ,X3X3X) X     X                           UXUXUXUXUXUX",
+"UXUXUXUXUXUXh ] 5X5X<Xh < 4 k b M U M L L @.@.@.g.G.G.F.G.Y.W.W.G.G.G.W.*X*X*XW.E.W.Y.W.n.[ h : # . . .                                     + . = e C ;.N.d.D.'. X|.|.|.|.|.}.].).^.^.~.~.~.I.L.8./ K T +.1.d.F.F.D.<.0   . . .                   . # .         . 2 2 2 1 1 4 k k M n F V V V D H ;.D.P.L.2.u % % 8 V G P ( | | E.$X].(.(.(.).).].[.}.|.|.|.|._.R.S.d.Z.C.Z.A.C.8.>.-.-.;.-.-.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.J z 5 < .   X X       X O O O ; a _ >X3X6X7XiX' O O                               UXUXUXUXUXUX",
+"UXUXUXUXUXUX` <X5X5X] p < j k m K M M L L X.@.o.s.G.G.Y.W.G.G.G.G.G.W.*X*X*Xj.j.W.G.H.M.z._ d o . .                                       . @ % 8 C ..N.d.`. X|.|.|.|.|.|.|. X[.(.(.^./.~.^.R.>.P / T O.1.S.D.F.D.S.5.x . . . .                     # #         # e e r 1 3 j k n n n V F V D F -.p.J.K.S.Q 9 % % 2 w c ! ( |  .| y.H.).(.^.(.).].[.|.|.|.|.|.|.}._.U.S.a.p.Z.Z.7.2.:.-.:.-.-.-.-.-.-.-.:.-.:.-.-.:.-.-.-.Q Q Q Q Q D l 2 $ O X X X         O O : ) >X3X4X6XiXiX1X: O                                 UXUXUXUXUX",
+"UXUXUXUXUXUX] <X5X<X_ : < j m m L K L L L L o.$.s.G.G.G.G.W.W.A.S.E.E.W.W.E.j.s.E.S.A.m.} p : o . .                                         . = x O.1.A.'. X|.|.|.|.|.|.|.|.|.}.].).).^.~.R.,.H P / ,.+.a.F.L.D.S.S.i.D # . . .                     . # .       & r r r 3 j k n n v V V V F F H <.D.J.J.p.A = o o % = w C (  . .R R W H.).(.).).).].}.|.|.|.|.|.|.}.]./.A.i.C.C.7.6.>.Q -.-.-.-.-.-.-.:.-.Q -.-.-.Q Q -.Q Q J J J H H x 5 8 : ; * X X O   O O O a _ ,X3X6X7XiXsX1Xf O   O O                           UXUXUXUXUX",
+"UXUXUXUXUXs <X5X5X2Xh # 1 j b M M K L L L X.o.1.s.G.G.G.W.W.G.G.A.j.W.j.j.j.7.j.s.A.E.qX_ s + o .                                         . % 9 k O.s.'. X|.|.|.|.|.|.|.|.|.|.|.}.].].].Y.,.D H H $.1.u.S.K.F.D.S.Z.i.J &     .                       . . .   X & Y g e j k n n v V V n F D D -.7.D.F.D.6.Z & . % % . & q v b R i t y E H.|.[.].].[.|.|.|.|.|.}.}.[.[.).U.Z.5.i.7.5.>.-.-.-.-.-.-.-.Q -.-.-.Q ..Q ..J J J J J H D F D z q 2 a _ > *     O O O ; r ' >X3X6X7XiXfX7Xf @   O O                           UXUXUXUXUX",
+"UXUXUXUXUXh <X5X5X<Xe & < j n K K M M L L G o.1.G.G.G.G.d.W.j.W.W.s.A.j.j.i.5.i.s.E.M.} s : + o .                                         . # 5 k +.U.}.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.!.>.H H H G O.1.a.L.L.G.A.Z.p.7.Q 2 . . . .                       . .   o h ` ` g j k n n v V V V n D J >.C.D.D.Z.2.u % o % % o . & 8 q l y y y y Z $X|.}.[.[.|.|.|.}.}.[.}.].].).^.L.7.>.<.>.>.-.-.-...-.-.Q -.-.J J J J J J J J J H G D D F V c q 3 a f h * X X   O - - a ' >X9X6XiXiXfXdX_ O   O O                             UXUXUXUX",
+"UXUXUXUXUX` 5X5X5X .t # 1 7 m n n K K G L L O.u.f.S.f.S.G.W.W.S.A.s.s.s.i.8.u.8.s.j.c.f : : % o . O                                       o & j M u.).[. X}.|.|.|.|.|.|.|.|.|.|.|.|.@X>.H H L X.X.=.1.S.L.F.S.A.A.7.8.-.8 . .                           . # X , ` 1X} Y b M n n V V F V V D ..7.Z.Z.Z.C.Q 9 % % . % . . . . 9 5 q 9 = 9 % Z _.|.}.|.|.|.}.}.[.}.[.[.{.].^.P.B.......-.-.-.Q ..Q J J Q J J J J J H J J G D D F V V V c B 6 7 r ) f > * * @ - ; p a ' >X,X6X7XiXiX7X' @   O O                             UXUXUXUX",
+"UXUXUXUXUX .5X5X5Xt , o 1 j b n m F M M M G X.u.G.G.G.G.Z.W.j.E.j.j.s.5.1.<.1.5.s.E.c.a ; + + .           O   O   O O                     . & k M S.).).].}. X|.|.|.|.|.|.|.|.|.|.{.6.J D T T l.&.O.5.D.L.G.Z.Z.s.E.s.;.0 # . .                         . # o , <X2X>XI M k v v V n V F V D :.C.D.C.C.7.A 9 % o . % .     . . & 0 q 9 = = y ^ {.|.|.|.}.}.}.}.[.[.[.{.{._.H.4.J M ..-.-.-.J J Q J J J J J H J H G H D D D D D D V c V c l 4 r f ] ` * *   - - ; a _ >X,X6X7XiXiX6X' - X O O                             UXUXUXUX",
+"UXUXUXUX, ` ] ) s + # < 7 7 b n n n G G K G =.s.G.G.G.s.E.G.W.s.s.i.s.1.<.1.1.1.8.j.T a ; @ o . O         O O O O O O O               . . O & 4 F C./.'.(.).}.|.|.|.|.|.|.|.|.|.{.6.Q H P l.b.eXx.1.Z.D.Z.Z.s.C.E.8.j.>.q # .                           . # . , <X5X .} U M M V V V F V C H 2.C.C.C.C.6.A 9 % X . . .         % 2 5 0 2 = t t V.}.}.|. X}.{.[.}.[.[. X/.B.3.,.P M =...Q -.J J J H J J J H H G H D D D D D D V V B B V B l b f ' 1X] h * O - - p a _ ' 9X6X7X7X7X9X' +   - O                             UXUXUXUX",
+"UXUXUXUX, , @ X     # 1 6 l v n n n K M G n J s.G.f.G.s.s.j.j.j.s.i.i.1.+.;.;.1.g.5.S + @ + @ + O O O O O O - - - - O O   O         . + + . # 5 F t.A.R././.].}.|.|.|.|.|.|.|.'.8.H H P q.n.rXyXm.j.W.E.A.8.8.8.8.t.s.8.N # .                           . # . +  .0X` { U M n V V V n V D J 4.C.C.7.7.6.A & = o . .         X   o # 2 q 2 t t R V.].|.|.}.{.[.}.[.].^.B.! ! ! H K G J J J J J J J J H J H D D D D D D D D V V V V B V B l 7 [ } 3X1Xh *   - - ; a _ ' 3X6X7X7X7X,X_ ; O O @ O                           UXUXUXUX",
+"UXUXUXUX@ X         # < 7 k v m n n F M n n J s.G.f.W.G.A.Z.j.A.8.i.1.1.;.+.;.1.4.,.x , @ @ @ + O O O - O - ; ; ; ; - O         O O . . % o % = z F ! V.H.H.^.{.|.|.|.|.|. X#Xt.W ~ H ! c.n.qXv.j.E.E.E.E.8.8.4.<.8.t.8.z                               . .   % e ` [ U m m n V V V V V D Q 6.7.7.7.7.4.A % o o .               . o & 2 0 u i E y.:X$X X{.}.}.[.{./.B.Q ! / / q.X.G ..J J H H H H H H D J D F D D D D V V V V V V V C B l l r } 1X<Xh = X - ; p a f 1X6X6X7XiX7X,X_ ; @ O O O                           UXUXUXUX",
+"UXUXUXUXO X         # < q x v n n F n n n G L i.d.G.s.a.s.j.s.j.s.1.1.;.+.;.;.1.1.,.N & @ @ @ @ @ O ; - - p p a p ; ; - O O O O O . . O + & > = 9 6 x E 3.B.H.).}.|. X X.X@Xy.! ! P J ,.l.l.e.1.5.8.t.j.m.j.8.1.>.;.<.-.8 . .                             . . # 9 > b m m m V V V V V V H 2.6.6.6.6.6.4.A % o   .   X X             % & 5 q u R ( IXIX$X$X[.[.[.].T.y.E ( ( / 0.,.;.-.Q Q H J H J D H D H H F H D D C D D C C V V B B B z x r _ ,X} g * @ ; - p a _ ,X6X7X7XiX7X>Xs p O O O O                           UXUXUXUX",
+"UXUXUXUX            . < j v v n n n F n n F ..i.G.S.a.s.s.s.s.i.i.<.;.+.+.O.O.;.,...S : & : , + , - ; , p a a a a : - - - O O O ; + @ + * , > i w c x N Z ! 3.H. X|.}..X-Xy.! P J o.o.#.$.,.;.<.<.8.4.r.t.t.t.8.;.;...F < .                               . . % 2 & j m m n B B V V v V J :.6.6.6.6.6.2.A o     . X * X               o 2 0 z Z R IXIXIX$X$X{.|._.E.( S A P S #.t.p.7.4.:.Q H H D D H D H D D D D D D D D V D V V C V B x l w _ 1X}  .t @ ; - ; a ' ,X6X7X7XiX7X>Xa : O - - O                           UXUXUXUX",
+"UXUXUXUX            . < 6 x v v v n F n n n G i.s.d.s.i.8.5.1.1.1.+.O.O.O.O.o.O.o.J w a s e > : : : a a > s f f f a p p - + + O + @ & = t > g { eXqXT N u ( y.%X@X{.@X%Xy.! ! -.o.O.O.O.O.;.;.<.;.;.;.;.q.0.0.,.,.....V #   .                             . # 2 8 < 4 x v m V c V V V V H 2.4.6.6.4.6.4.A = . .   X * *                 o 2 l N R R IXIXIX%X$X X!.y.P E A D V x D >.C.R.C.2.Q Q H H D H D D D F D D D D C C V V B V V B N l q f 1X} g > * + ; - a >X6X7XiXiXiX6X3X) : @ - @ O                           UXUXUXUX",
+"UXUXUXUX          . . $ 6 j v v n v n F n G G 1.s.s.i.5.1.<.;.;.O.O.=.O...G o.o.o.F 0 > d d f d a a s f f f f f f f a p ; ; @ + o o * > h ` tXbXmXNXy.A E / m.IXIXZX%Xc.P P q.#.$.O.O.O.;.<.,.<.,.;.;...,.,.q.q.,.;.-.D $                                 . # 8 8 5 4 k v V c c v V V V J 2.2.2.2.2.2.4.W % o     X * *                 X o & 5 R R | %XIXIXIX%X%Xy.( E A B x 9 % 8 W 7.A.C.7.2.-.H D C D D D D D D D D D V V D V V C V z w l ` 1X} Y t = , ; : a >X6X7XiX7XiX7X6X>X,   O -                             UXUXUXUX",
+"UXUXUXUXX         o . $ 3 x c n n v n n F F G 1.i.s.1.1.1.;.+.O.O.O.G ..=.X.#.o.o.G 5 > f f f d d d f f _ _ [ _ f s > ; ; ; , @ @ * t g b.NXGXNXyXn.w.J ! y.m.IXIXIXtXy./ ,.$.$.$.O.;.;.,.>.4.,.;.;.;.;...P / q.,.,.,.V #     .                           . & w 0 2 4 x V V V c V v V D Q :.:.:.>.>.2.2.W 9       X X X                   X . % w u R (  .2XIX%X%Xy.^ P c l 9 * * = = N Q 2.C.C.6.:.Q J H D D D D D D D D D D C C C C B z z w [ 9X1XR y > ; ; ; r >X6X7XiXiXiXiX7X,Xp O O -   X                         UXUXUXUX",
+"UXUXUXUX  X X X X   . # 1 l v v v n n n n n G ;.1.1.1.O.O.O.O.=.=.=.G G L #.#.%.$.F 6 > f _ f [ _ ` _ _ [ _ ` _ _ d d , , , > s > h | hXMXGXNXeXm.v.w.,.,.,.m.m.eXm.n.c.*.*.$.$.O.O.,.,.,.;.,.1.,.,.;.....J P ! ,.9.,.N #                                 . & w w 0 3 j v V c c V V c V W Q :.:.:.:.:.3.Q 9         X                       X * = 9 q l w Y y.m.y.! H z 5 9 * * * o o o % w Q 6.C.B.4.:.-.J H D D D D D D C D C C C C B N N b 1X0X} g y t h ; ; r >X6X7XiXiXiXfXiX>Xa . O O O                           UXUXUXUX",
+"UXUXUXUX  X X X     . # $ l v v n n v n n n G =.;.1.O.O...=.M G G M G =.#.#.%.c.$.K l d f ` [ ` [ _ ` [ ` _ [ _ f d > , , , h g z.rXbXbXNXeXv.c.0.0.9.,.,.w.v.m.m.n.n.v.w.w.,.O.,.;.,.;.,.,.,.,.,.,.,.o.....o.o.,.2.,.0                                     2 w w 2 1 j v V V c c c V V H ~ ~ Q :.~ ~ :.~ y X                             X X * * t = 8 w w N E R N N w = * * * * X   X o = 9 N Q 4.C.7.2.:.Q H H D D D C D C D C C C C Z l } 1X1X1Xg y t , : ; a >X6XiXiXaXfXfXiX' + + O O                             UXUXUXUX",
+"UXUXUXUX@ X X X X . . . $ 6 k v v v n n n F F ..;.+.O...=.G G M M G M X.%.l.l.c.#.M b d ` ` ' } [ ` ` [ ' ` f h > > > > ` ` } rXbXGXNXeXv.0.9.9.0.9.q.0.0.r.w.w.v.v.e.w.,.w.9.,.;.-...o.,.,.,.,.,.,.,.....L P o.,.8.J =                                   . 2 u N 8 3 j v V v c c c V C H H W ~ Q Q Q Q W y .                           X X * * t * * * t 9 9 9 9 = = * * * * * * o *   X X X % 2 N :.7.B.7.6.>.-.J H D C C C C C C D C z b ' 9X9X} t t t > > ; _ ,X7XiXiXfXfXfXdX) @ O @ -                             UXUXUXUX",
+"UXUXUXUX  X   X X     . $ 3 k x v v v n v n n F O.O.O.M M M M n M M M X.%.l.n.b.&.M m I ` ] ' } [ ` f f f f d s > > s g } bXGXbXbXyXn.0.q.9.9.,.9.9.0.0.0.0.9.0.0.0.0.9.,.O.,.o.,.,.,.o.o.,.9.q.q.q.,.o...J o.P q.8.D #                                   # 8 A Z 2 3 j k V c c B c B B D A H W H Q W ~ A 9 .                           X X t * * * * * * * * = * X * * * * * * X * * * o       X o 9 Z :.7.p.C.4.:.Q H H D C C C C V C N w 1X2X2X` y t h > , + _ 3XiXiXfXfXfXfX,Xd ; O @ O                             UXUXUXUX",
+"UXUXUXUXX X X       . . # 3 k x v v v v n n n G O.O.=.M M n n M n M M @.&.x.b.x.#.M m I f _ ' [ ` f d : > : h h h ` } rXbXGXGXNXeXm.0.q.9.$.q.9.9.9.0.0.e.0.0.0.0.0.w.9.o.9.,.,.,.o.,.,.,.9.9.,.q.,.q.,.,.P ..o.,.8.S                                     $ w A Z 8 1 j x v V c c c c V B z B B C H H H A 9 o                         X * * * * * * * * * * * * * * * * * X * * X X * X X X X X X o X o 9 E W 4.7.7.2.:.Q J H C C C C C C Y } 0X1XR y t t > : : ' 6X7XsXfXfXgXiX>Xa ;   O O                             UXUXUXUX",
+"UXUXUXUX    X         . # 1 j k v k v v v n n F G ..M M n n n n n M =.L &.l.b.b.l.T U I g ` ` ` f g f > , > g } qXhXMXGXbXNXyXn.m.0.9.#.9.9.q.0.0.0.0.0.0.0.0.0.0.y.9.q.,.9.o.9.9.9.9.,.9.q.9.9.9.,.q.,.,.o.o.,.>.q.w                                   . < z A Z 9 1 j k c c z z c c c x l 6 l x B N B z 9 o .                     X * * * * * * * * * * * * * X * X X X * X X X * X X X X X           * = y u Q 2.7.B.6.:.W D C C A A N I 1X9X` t y t i e @ ; >X6XiXsXfXfXfXiX] a ; O   O O                           UXUXUXUX",
+"UXUXUXUX  X             . 1 j v k k v v n V n F G M M n M M n M n M M M L &.l.b.l.{ K b f f h d e > > h h } eXzXMXGXbXhXtXn.m.c.0.0.9.q.9.9.$.9.9.q.0.0.0.r.0.0.0.9.0.9.q.9.9.9.9.q.9.0.w.y.0.q.y.9.q.q./ q.q.y.,.P : O                                 . < N A Z y 1 j k c c z c c c c x 5 5 3 6 q l x q 2 #                       X X * * * * * * * * * X * X X * X X X X X X X X X X X X X X . X     o o o = = u H >.6.6.3.-.Q H A A S [ 2X1X` y i i h > @ p >X6XiXsXfXfXfX9X) ; ; O @ @ O                           UXUXUXUX",
+"UXUXUXUX                . < 4 x c v v v n v v n M n k n k k n n n M M M L L &.l.b.%.U m r s e & o @ > [ rXMXGXMXJXNXtXm.v.c.0.q.q.q.9.0.9.q.0.9.9.9.0.0.0.v.0.0.9.0.9.9.9.0.9.q.9.0.0.v.c.v.0.c.c.0.0.0.0.q.,.8.w.I + +                                   1 N E Z r 2 4 j k c c c x c c l 3 1 1 1 3 6 6 5 2 $                       X X X X X X * * * * X X * X X X * X * X X * X X   X   X                     X X o 9 Z Q >.6.2.Q W A Z ' 9X1XR y t i i > & : >X7X7XsXfXfXiX>Xp - - @ O                             X UXUXUXUX",
+"UXUXUXUX                . $ 3 x x v v k v v n n n n n k n n n n n n M M M M L { %.c.$.L b e f h s } 2XbXMXMXNXhXtXn.c.c.c.c.c.0.0.q.9.9.9.q.q.9.9.9.0.0.0.e.0.0.0.0.0.0.0.0.c.c.0.v.t.v.v.m.v.v.c.c.y.m.c.0.,.t.b._ + +                                 . 5 C A N 9 < 4 k x c c x c c c x 3 1 1 1 1 3 5 3 5 <                           X X X X X X   X X X X X X X X X X X X X X X   X X X X                 X X X X X o 9 z ~ 2.2.:.A S ' 1X` t y i t e e > a ,X9X7XsXfXfXiX' - O O - O                     X X   X   UXUXUXUX",
+"UXUXUXUX                . $ 3 j k v c v v v v n k M k n k n n n n n n M L G X.X.#.w.9...K I _ } dXxXbXbXhXyXn.m.b.c.c.0.0.0.0.0.q.9.9.q.9.$.9.9.9.9.0.0.0.0.c.0.0.c.0.0.0.c.c.c.m.n.n.m.m.n.n.n.tXm.eXtXn.t.t.tXqX_ a + . .                             # 5 Z E u % $ 4 j x x z c x c c x 3 1 1 1 1 1 1 1 1 1 #                             X X     X X X X X X X X X X X X X X X X X X X                     . X   X . o o = 9 N Q :.W u _ f t t y t R t > = s >X6X7XiXiXiX6X) @ O O O O                 % % * X   X   UXUXUXUX",
+"UXUXUXUX                  # < l c c k z v v k v n v n k n k k k n n n G M O.;.<.1.<.4.:.H Y dXxXbXbXrXn.c.0.q.q.q.c.q.c.0.0.0.q.9.9.$.q.q.9.$.q.9.9.0.0.0.0.t.c.v.c.c.v.v.v.n.m.n.n.eXtXtXrXrXNXlXbXbXrXn.m.tXwX1Xs a + O O .                           $ 6 A W u % $ 3 j k x c x c c z x 6 1 < 1 1 1 1 1 5 1 1 .                                     X X X X X X     X X X X X X X                               X     . .   o . & u A u > * = t > t t > = > e >X3X7X7XiX7X<X; X     O X                 = 9 o o X X X UXUXUXUX",
+"UXUXUXUX                  # < 6 x k x k v v v v v v n k k n k M v n G =.,.1.1.5.i.5.t.l.} 1X2XrXrXm.c.%./ P q.! #.q.q.q.0.0.0.9.q.$.,.9.#.9.#.9.9.9.0.0.0.v.v.0.v.c.v.v.v.n.n.n.eXrXtXhXbXkXlXbXbXbXlXtXm.b.uX2X' ) _ a ; O O                           < q W ~ u % % 3 j x x z x x x x z l 1 < < 1 1 1 1 1 1 1 < .                                         X X X X   X X X X X   X   X                             . .   . .   X X 9 S P u = = o & t > > > : & ' 6X7X7X7X3X)   @ O O O                 . 2 9 = o X X   UXUXUXUX",
+"UXUXUXUX                . . # 4 x k x k c v v v v v k k v v G M G O.;.1.5.5.1.8.0.b.2X8X8X,Xd ! t.9.q.! / P #.q.q.q.q.q.q.9.0.9.q.9.q.o.o.9.9.9.9.0.0.0.c.v.c.v.v.v.v.m.n.n.eXIXyXhXlXkXbXbXbXbXbXbXtXm.n.rXwX1X>X_ ' ' p O                           . < z Q ~ w # % 5 j x z x x x x z c l 1 < < 1 1 1 1 1 3 3 3 <                                       X     X X     X X X X X     X X                             .   . . . . % R q.T A A i y > o @ , ; + : _ 3X7X7X7X<X    O O O                   . y y t = * o X UXUXUXUX",
+"UXUXUXUXUX                . # 1 x x x x k z k v v v n n n M ..;.1.<.1.<...J P } 1X6X9X1X' a + 0 :.4.,.,.o.P q.#.#.q.q.#.q.#.#.q.9.9.9.#.9.#.9.9.9.0.0.0.e.c.v.v.v.n.n.n.eXeXeXrXlXkXkXbXbXbXbXbXbXyXm.n.rXlX1X1X>X,X9X1X;                           . # 5 H 3.~ y # % < j v z x x x x x x x 3 < 1 1 1 1 1 1 1 3 3 3 < .                                           X   X   X X     X X                                 . . . . . & i c.{ T W H H S i r 9 : + : : a ,X6X6X3X) O     O O X                 % u y t = = o o UXUXUXUX",
+"UXUXUXUXUX                  . $ j x x k x x x v F G J ..;.1.1.;.;.-.F c r f ' ,X3X1X' s ; ; +   S ,.4.,.,.,.#.#.#.,.o.,.q.,.q.9.9.,.9.o.o.9.q.q.0.0.0.v.c.v.v.m.n.n.n.eXeXyXNXlXbXkXbXbXbXbXbXbXrXn.n.tXlXdX1X>X9XiXiX'                             . # q :.2.^ w & % 8 j v c x x x x l x x 6 < < 1 1 1 1 3 3 3 3 3 3 <                                                     X X X   X                                 .   . o o 9 / v.c.T W W P P P S S w r 2 2 < >X6X3X' p ;     O         X         o 9 u y y = = = o UXUXUXUX",
+"UXUXUXUXUX    X             . $ 3 l j x k x c n G ..<.i.u.;.J V N r r a s _ ' ' ] ] a + + . + + # S t.8.,.,.,.o.o.! o.o.o.#.,.o.q.#.,.9.9.#.$.$.9.0.0.c.v.v.n.n.n.n.n.eXIXhXlXkXbXbXbXbXbXbXJXlXeXeXtXuX9X1X1X9XsXfX9X)   O O                       # $ l 3.2.~ N & % 2 q c k c x x x x x x l 1 < 1 1 1 1 3 3 3 3 3 4 3 <                                                 X   X   X   X                             .   X o o o Y v.b.c./ ~ ! ! ! W P A T S r r 3 ' ,X>Xa - O     X                   % y u y y y = * o UXUXUXUX",
+"UXUXUXUXUX    O               $ < 6 l j x n F ..;.5.i.5.P b & : + : p a a a a a a O O + O O + + . # K t.8.>.,.,.-.P P o.,.o.,.q.o.q.q.o.9.q.%.q.0.0.c.v.m.b.m.eXtXeXeXyXlXlXbXkXbXbXbXJXJXbXNXn.n.rXpXdX9X1XdXfXgXiX,Xp - O O O                   . % < D 2.3.3.Z & 9 & 0 j z x x l l l x x j 3 1 1 1 1 1 3 3 3 3 4 3 4 3 < X                                                   X X   X                           .   X   X X S c.n.c./ ! ! ! ! ! ! P P P S m b l _ >X_ : . O                       # 2 u R u y y 9 % o UXUXUXUX",
+"UXUXUXUXUXUXX     X   X X   . # $ 5 x c F ..<.p.a.t.#.[ _ ; + O O O ; ; a +     X X   O . + + . + O # S t.8.2.;.,.....P o.,.o.#.,.#.#.q.q.$.q.0.0.c.c.v.v.n.eXtXtXtXrXlXbXbXbXbXbXbXMXbXbXyXm.tXrXlX0X8XpXsXvXcXfX6X] a ; O                       . 2 q Q 6.4.3.Z 8 8 8 8 l c c x l l x x x l 6 1 1 1 3 3 3 3 3 3 3 3 4 4 4 1 . X                                                         X                         X . o o S c.b.| / ~ ~ ! ! / / P P T T T T I T [ { r + # . O         X     X     & u Z Z Z y y t @   UXUXUXUX",
+"UXUXUXUXUXUXX X X             . $ 5 B Q >.5.i.r.#.I _ ) a + . . . O O . O .               . @ + + + . # x ,.8.6.>.,.o.o.P o.o.! #.q.#.#.#.9.0.0.c.c.v.n.n.eXeXtXNXlXbXbXbXbXJXbXbXGXbXNXyXn.tXlXlX8XpXdXxXvXnXxXiX3X) p - O O                   . % q c 2.B.6.:.Z w w 8 8 x c v x l l l l q q q 3 3 3 1 1 3 3 4 3 3 4 4 3 6 6 3 &                                                   X                         X   . o o % S c.c.c./ ! ! ! ,.! / ! P P P T { } qX1X{ U 2 # # # .                 X   & N Z Z Z u y t @ UXUXUXUXUX",
+"UXUXUXUXUXUX.   X   X   X     . # 0 H <.i.1.#.Y _ s a a : .   .                         O O @ @ + . + + . 7 ,.t.8.8.:.,.o.o.o.,.o.#.q.#.#.q.0.c.c.v.n.n.tXtXrXNXlXkXbXbXbXMXbXMXbXNXyXeXn.2XlXpXpX8XlXxXmXmXcXaX6X<Xa ; O O O                 . . $ l Q B.B.B.:.B u w u w x c V N l l l l l l l 5 3 3 1 1 3 3 5 4 6 3 3 4 4 j l j <                                                   X   X                     X X X = S 0.c.{ / ! ~ ! ! / ! / P P P T { { z.1XqXz.b 2 $ $ # # #           . .   . w Z Z Z Z u u 9 o UXUXUXUXUX",
+"UXUXUXUXUXUX. X X               $ 5 Q <...S f f a a ; + .     .                           O + @ + + + + O # 7 K y.8.8.2.,.q.,.o.#.P #.&.&.%.c.c.v.m.n.tXlXlXlXbXbXbXbXbXbXbXJXZXyXtXn.tXdXdX0XdXpXkXMXmXmXnXkXpX6X) : - O O                 . . # < B 2.B.C.B.>.Z N N N u S c v c x l q q q l q q 6 3 3 1 3 3 4 4 4 3 4 4 6 4 l x x 5 %   X   X                                       X                     X X X = u P q.c.{ / ! ! ! ! q./ / ! P P L T { } } z.z.[ r 8 2 & & & # # .       . . & 8 A W E Z u y u =   UXUXUXUXUX",
+"UXUXUXUXUXUX  X   X     X X     $ 3 l w e > a p - O .                                     O + ; > & : . + ; + r Y c.t.8.8.1.,.$.9.q.q.%.c.c.c.c.n.n.tXhXlXbXbXbXbXbXbXJXNXyXtXyXtXtXrX2X0X8XpXkXbXmXmXmXnXvXjX6X>Xa ; ; O O O           . . . . < 6 Q C.C.B.B.:.A N N A E A B B c c q q q l l q q 6 6 3 1 1 3 5 6 6 4 4 4 4 4 j k c z 6 < o X X X X                                   X X X       X .   X X   o 9 C ! #.&./ ! ~ ! ! ! / / / q.P P L T T T T T U I I e 2 8 9 2 2 < $ # .   . & & 5 A ~ ~ E Z Z Z y =   UXUXUXUXUX",
+"UXUXUXUXUXUXUX  X           X * $ $   O - O O . .                                           : : : : : : + @ + : r f T c.t.8.8.8.8.w.9.,.q.0.c.c.v.b.eXyXNXlXNXNXbXZXyXIXyXeXyXtXlXuX2XpXpXlXbXMXGXmXmXnXvXaX8X3X) a ; - O O             . . . % 2 x 2.C.C.7.B.3.A A A A E ! A N c c l q q q q w q q 6 3 3 1 3 5 6 6 4 4 4 4 4 j l l x c j 5 $ o X X X                                   X X X X X   X X   o 9 q H o.o.P / / ~ ! ! ! / / / / / P P P T T T T m v q 8 9 9 9 9 = 2 2 % # # 2 2 0 5 c Q ^ ~ E A Z Z u = UXUXUXUXUXUX",
+"UXUXUXUXUXUXUX    X     X X * * # .     O .       O                                         + : : > e > : : + : ; r r Y 0.y.%Xt.t.t.t.t.t.t.v.e.v.v.n.n.yXIXyXZXyXyXeXeXtXtXlXjXjX0XpXsXbXMXmXGXGXmXmXnXxXpX8X,Xf ; ; O O O           . . . % 2 5 Q B.C.C.C.C.4.Q E E E ! ( E C V V z q q q q q q q 0 3 3 1 3 6 5 6 4 4 4 4 6 6 l l x k z x l q 2 & X X X                     X           X X X X X X o 9 w C H H P ! ! W W ! ~ ! / q./ q./ T P K K T ( T v b j 8 9 9 9 9 9 9 9 2 = = 0 N C w w H :.Q ~ E E Z Z y = UXUXUXUXUXUX",
+"UXUXUXUXUXUXUX  X X     X * * * X                                                           O ; : d d a f d e : a : : & f Y z.b.eXb.m.m.t.m.t.M.m.n.n.%Xn.tXeXeXIXhXlXlXdXpXpXpXpXkXxXMXmXGXGXmXmXmXnXvXjX8X6X' a - O O O           . . . # 9 0 B 6.A.Z.C.C.C.6.~ ~ ~ E ! ~ E Z N D V x q q 0 q q q q 5 3 1 3 3 6 6 3 4 4 4 4 4 j 6 x x x x c x x l 0 8 % X   X X   X     X X X X X X X X o X X o & w N A J J H H H H ! W ! ~ ! / / / / / / P P P T T P V x l 8 9 9 9 9 9 2 9 2 9 9 w D Q A z z W :.:.~ W E W E 9 X UXUXUXUXUXUX",
+"UXUXUXUXUXUXUX        X X * * * X o . .                                                     O + : > f f f f f d r a a s s _ _ ' } tXtXtXtXeXeXIXyX%XtXyXeXtXtXlXlXjXjXjXpXjXkXkXbXMXGXGXGXGXGXmXmXmXxXkX8X6X>Xs ; ; ; O O         . . . . % 2 c >.Z.Z.C.Z.C.Z.7.^ ~ ( ( E ~ E A C D F V l 0 q q q q 5 0 5 3 3 3 5 6 5 4 3 4 4 4 6 j l l z z c x x z c x l w 9 & = % % = o o o = o = o o % = 9 u N C A H H H H D D H W ~ ! ! ! / / q.| 0.q.T P K P T P K v l 8 9 9 2 2 9 9 9 9 & % 9 A -.J C z Z Q :.:.~ ~ W ~ E = UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX  X   X * * * * X X . . .                                                     O + : a f f ` _ ` ` f f s f s s _ ` } 1X2XlXjXjXjXlXkXlXlXjXlXjXpXjXkXkXkXbXbXbXMXmXGXGXmXmXGXmXmXnXvXkX8X8X9X_ a a ; O O         . . . . % 2 q -.A.Z.Z.C.C.C.C.C.3.! ~ ~ ~ W ~ W A V D F z q 5 0 0 q q 6 6 5 3 3 6 5 3 5 3 3 4 4 4 4 6 q l l j l x x x z N c z z x w w w w w w u u w w w N B C D H H H C D D A A H W ~ ! ! / / / / | | / T P P H K P C c x 8 9 8 2 9 9 2 9 2 = 9 9 N :.-.C z V Q >.Q ~ ~ ~ ~ :.W @ UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX      X X * * X X o . # # .                                                     O + : : d f _ ' ` ' } ` _ ` _ ] ] ' 9X7X8X0XjX0XjXjXjXjXkXkXkXkXkXxXMXMXGXGXmXGXGXGXGXGXmXmXnXnXMXjX8X6X9X] a a ; O O         .   . . % 2 0 V C.L.D.Z.Z.C.Z.A.D.7.^ ~ ~ W W W W A D H H D z 0 5 0 q 0 6 q 5 5 5 3 6 5 4 3 3 3 3 4 4 4 6 6 l l l l l x x x x z c B B B B N B B B B B C A D H H A H H D A A C D H H ! ! ! / / / / 0.| q.T P P K F H C B l 8 9 9 8 9 8 8 9 9 9 2 9 w Q ;.-.V N J >.3.Q Q Q Q 3.2.A @ UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX    X X X X X X X X . . # #                                                         X + : r f _ ` ' } } ] } <X2X9X9X8X8X8XpXjXjXjXkXkXbXkXbXbXMXMXmXGXGXGXGXGXGXGXmXmXmXmXnXnXbXjX8X9X5X} ` a ; + O O       . . . % $ 9 8 x <.D.F.D.D.C.C.Z.D.D.7.^ W W W Q H H W W A H J C l q 0 5 q 0 q 5 5 5 6 5 6 3 3 3 1 1 3 4 4 6 6 6 6 6 l l j l l x l x z N N N N B N B B C Z C C C C C C C C C C A H H W ! ! ! / / / / q.q./ P K H H K V c x w 8 9 8 8 8 9 9 8 8 8 9 u Q :.J H D J <.2.:.Q Q Q :.6.4.y   UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX          X   X     X . # # .                                                     X +   @ > > h f _ ' ' 2X9X6X8X8X8XpXpXjXjXjXkXkXxXMXMXGXMXmXGXGXGXmXmXmXGXGXmXmXmXmXnXnXMXxXjX8X8X6X1X` s ; ; + +   . .   . . % # = 8 q Q D.L.D.F.D.C.C.D.P.R.6.~ ~ W W W W W Q :.W J ..J B q 5 q q 6 q 5 q 0 5 5 6 3 3 3 3 3 5 3 4 4 4 6 6 6 6 6 l l l l l l z z z B B B B B B C B B C C C C B N C B D H H Q ! ! ! / ! / / q./ P K A F C F V B N 8 9 9 9 8 8 8 8 8 8 8 y y H ;.:.J D J <.7.2.>.Q Q Q <.Z.~ X UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXX O X     X X o   . o % # # .                                                         @ @ + : a d f ` ] 9X6X8XpXpXkXkXkXkXxXMXMXcXmXmXGXmXGXGXGXGXGXGXGXmXmXmXmXnXnXnXMXxXjX8X8X8X9X1X] a ; ; + O       . % . # % 2 l H Z.F.F.D.S.S.S.S.L.I.I.6.~ ~ E W W W Q 3.2.:.Q ..J J V q 6 0 q q 5 q 5 0 5 5 6 3 3 3 3 3 4 4 4 4 3 4 6 6 6 6 4 6 l l q l z z N c N N B B B B C B A C C C B A C A H ! ! ! W K H K H K K F C D C C V V c q w 9 9 8 w 8 8 8 8 9 9 w u H >.-.J J D >.7.5.<.:.-.-.-.4.Z.Z O UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUX  X           X     o = & $ #                                                       X X X   @ @ , a , h ] 9X0XpXjXsXxXvXMXnXnXnXmXmXmXmXmXmXGXmXmXmXmXmXmXnXnXnXMXbXkXkXjX8X7X8X6X6X>X) : - O . O   . . % % % % 2 w D p.J.F.D.D.D.S.D.L.I.^.U.3.E ^ ~ W Q Q ^ :.2.3.:.Q Q ..J B q 0 5 q 0 5 5 6 5 5 5 3 3 3 3 3 3 3 4 4 3 3 5 3 3 6 4 6 q l l l z z z N c N B N B B B B A C B B A D H H Q ! W H A B V B V B B V V V V V V z w 9 9 8 8 9 9 8 9 9 8 8 w u A <.2.J J J >.p.p.4.4.:.-.>.<.a.6.=   UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUX                  o = = y 9 # # .                                                       X     @ @ @ ; : d ] 9X8XpXjXxXvXcXnXmXmXmXmXmXmXmXmXmXmXmXnXmXnXnXnXMXbXbXkXkXjX8X8X6X8X6X5X' : ; O O O . . . . % o % 9 2 v 5.F.J.F.S.D.S.F.F.P.(.^.U.6.E ~ ~ E ^ :.:.2.3.4.2.Q Q ..J J N 0 5 0 q 5 q 0 6 5 5 5 5 3 3 4 3 3 4 3 3 3 3 4 6 6 6 6 l x x z N z B N c N B B B B A C C B B B C D H H ! Q A B c z c c c c c V V V V N z w 8 8 8 8 8 8 w 9 9 8 9 8 u E <.>.J J J ;.a.a.7.5.4.:.;.5.d.F.W O UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUX        X     o = % = 9 9 9 < $                                                             @ O O , : > > ) ,X3X6X8XjXbXMXbXMXMXnXnXnXnXnXnXcXxXxXxXxXxXjXpX8XpXpX8X8X8X5X9X1X,X>Xs ; O O O .   . . % & = 9 w v >.L.K.J.F.D.S.F.F.F./._.^.U.V.E E ~ :.~ :.:.2.2.2.4.:.-.Q J J J z 5 0 0 q q q 0 q 5 5 5 5 6 6 5 6 3 3 5 4 3 6 6 6 q l l l x z z N z N c z B B B C C C B c B V C A H ! ! ! H V c c k z c x c V B c z q w 8 8 8 9 8 8 9 w 9 w 8 8 u A 2.>.-.-.-.-.5.Z.p.7.<.4.2.<.a.J.D.y X UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUX      X o X   X = = y y u w 0 3 $ .                                                       O     X @ ; ; ; @ ; ) ] 3X,X0XjXjXjXkXxXxXkXaXsXiXdX9X9X9X3X,X,X>X>X,X3X9X9X>X_ s : < + - O . . . o . . % 2 y u B G 5.~.(.P.J.F.F.S.F.L.U./.).~.U.B.u Z 3.3.3.2.2.2.4.2.4.4.>.Q -.;.;.J C q 2 q q 5 0 q q 5 0 5 5 6 5 3 1 3 3 3 6 6 q 6 l l x x x z N c B c B N B B B C C N c c B V C H P P ( P P C V c x x x c k N x w w 8 8 9 8 8 8 w 9 8 8 8 u u Z :.4.>.:.-.-.<.p.S.Z.p.5.4.4.5.a.D.J.:.O   UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX    X * o = = = 9 9 w y u w 0 1 $ .                                                     X X X O @ - , @ @ : : g ` ] <X3X0X0X0X9X9X3X3X,X,X>X>X' ' ) _ ) _ ) ' >X>X] a : . . + O . O O . % . . % = y u C -.C.~.(.^.~.K.F.F.D.F.U.U.(.).~.U.~ 9 y ^ V.6.6.3.2.2.2.4.4.>.-.Q :.;.;.-.H q 0 q q q 6 0 0 q q 5 5 5 5 1 1 5 3 6 3 6 l x l x z z z N B z B c c B C B B B z z c c V D H W P ( ! H H V c c v z z z l w 0 8 8 9 w 8 9 8 w 8 9 9 w u A :.<.<.;.;.-.5.D.L.S.p.7.5.5.i.Z.D.K.F.u   UXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXO     X = t y = = 9 9 w u u N q 1 $ .                                                           @ @ @ @ - - , h h h h _ ] <X<X<X] ] ) ) ) f a a a a a : a a f _ s a - ; O O O O O   . # . . % = y Z H ..C.(.].(.(.~.P.J.F.J.L.~.(.).(.^.H.N % y ^ B.B.A.6.2.>.>.>.2.4.4.:.-.;.>.;.>.J q 2 5 5 q q 0 q q 0 5 0 2 5 1 5 1 1 5 q l x x z z z z z N c c N B B B V B B z N B B D H H J P P H H H D V c x l q w 8 w 9 8 8 8 8 8 w 8 8 9 8 8 u E 4.5.>.-.;.;.4.T.`.J.D.C.7.5.i.C.D.K.P.2.o O UXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX      X = y y y y y 9 u u u Z C N l 1 # .                                                       X X O @ @ , ; , , > > h g g g g g d a a a ; : ; a : ; : : a a p ; ; ; + O O + + . . # % % o 9 w N -.<.A.(.).{._._.^./.K.J.T./._._.).(./.! o * y W 3.B.!.A.6.2.2.>.>.4.5.4.>.>.<.<.<.<.-.B 0 5 q w q q q 0 0 5 0 5 5 5 5 5 5 q l l l z z z c c c B B B B B B B B B B B B B D H H H H D D B B B z q w w 8 8 8 8 9 8 9 w 0 8 8 w 8 8 2 A :.2.5.<.-.;.;.7.T.#XXXL.D.p.i.i.p.S.J.I.A.w   UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX  X X * y E Z y 9 9 u u N Z A A D x 1 $ # .                                                       X O @ @ , , s > s h > > , , > : ; ; ; ; ; + ; + ; + + ; + ; O . + + O . . . . % % % & & 9 u J 5.R.).).)._.{._.(.^.I.XX=X+X'.{.).^.B.&   o y E 3.B.!.W.A.8.>.>.<.4.5.5.7.<.<.<.<.;.5.;.H N q 0 0 5 0 0 0 5 0 0 0 8 5 5 5 q q q q l z z z c c B B B B B B B B V B V B C D H H C C B z z l q w 0 8 9 8 8 8 8 0 8 0 8 8 8 9 w 0 w W 4.5.<.<.1.<.<.p.I.oX+XOXT.F.Z.a.Z.S.J.P.P.:.O   UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX      X t E E i w y y w N Z A H H D c 4 < # . .                                                     O   @ @ , , s , ; , ; @ ; , ; ; + + ; ; + + ; ; + + O . O . O . . + . . # . . % = & 9 8 x -.R.].].).)._._._.(.^./.+X;X#X_.].).'.E     @ = E :.6.!.Q.W.A.4.;.4.<.4.5.i.7.4.<.;.<.<.<.;.Q B 0 2 0 0 q 6 0 5 0 5 0 0 5 0 5 0 q w w q q z z z z N B B B B c B V B B B B B C B B N w w q w 0 0 8 8 9 8 8 w 0 8 8 0 w 8 8 2 8 Z ~ 4.p.5.1.;.;.5.Z.I.'.XX+XOXXXY.F.D.Z.L.P.~.Z.9   UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUX  X O = u ^ ~ Z N u N N Z A H W W Q F j 1 < # # .                                                       @ + + - + @ O @ - O O @ ; + ; + + + + . O . O . . O   . . . . % % = o % 9 8 w l F ;.H.).].{.).).)._._.{..X:X;XSX#X(.)._.B.o       , u ~ 6.A.&XOXY.C.5.4.<.5.5.7.p.5.5.<.<.<.<.5.u.<.J N 2 5 0 0 0 q 0 0 0 5 0 5 2 0 0 0 0 0 0 0 w q l z l z l x l z N N z N z N w w w q w 0 8 8 8 8 8 0 0 8 0 0 w 8 8 8 8 8 2 u W 4.7.5.<.;.;.5.s.R.~.~.~.`.XXOXOXQ.T.L.J.K.~.U.! . O UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUX  . X o t E 3.3.E Z u Z Z A A W W Q -.J n j 3 < # # . .   .   . .                                                     O O . O   O .               .   .     . . . o . % & % 9 9 u N V ..a.Y.^.).[.[.{.).).).)..X#X;XSX;X:X(.].H.w         * = E 2.B.Q.Q.XXU.D.5.4.5.7.5.p.a.a.p.5.<.<.5.i.i.i.<.J N q 0 0 0 q 0 q q 0 0 0 0 0 0 5 8 5 8 0 8 w 0 0 w 8 0 0 0 q w w 0 w 0 8 8 8 8 8 8 8 0 0 0 8 8 0 8 w 8 w w 8 8 9 N Q 4.i.i.i.1.;.;.5.U./.(.^.~.I././.XX=XOX`./.~./.~.7.    UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUX  O o t i ^ %X3.E Z B Z A W H W Q Q :.-.F k j 3 < . . . . . .                                                                                 . . . . . o o o % o % % % 9 9 w B G <.D.I.I.I.^.).[.].).).).]..X:XSXSX;X:X).).3.          + X u 2.A.Y.Q.XXT.P.D.5.5.5.5.p.p.a.p.Z.i.5.5.5.5.5.i.1.>.J A l 0 0 0 0 0 0 0 0 0 0 q 0 q 0 0 0 0 8 8 0 8 0 5 8 0 0 0 0 8 8 w 8 w 8 0 8 w 0 0 w 0 w 0 0 8 0 8 8 8 8 Z W 4.p.p.5.1.<.+.+.i.P..X{.(.^.I.I.I./.`.=X-X+X`./._.L.w     UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  * * y E V.*XV.( A A A H W W Q Q Q ;.>...M k j 3 $ # . . # . . .   .   .                                                           .     .   . . . o o o % & = = 9 9 w l V ;.C.I.~.I.I.I.~.^.].].].].]. X.X;XSX;X;X#X).H.y     UXUXUX  O * ~ A.Q.Q.T.U.I.I.D.i.5.i.i.p.p.a.a.d.a.i.5.<.1.5.i.i.5.>.Q A N 0 0 5 5 0 0 0 0 0 w 0 0 0 0 0 0 0 8 0 0 8 8 8 8 8 0 8 8 8 0 0 w 0 0 0 w w 0 0 0 8 8 0 8 9 w N Q 4.7.i.i.5.1.;.+.i.S.K.~._.{.{.^.I.I.I.~.XX=X:X=XoX_./.:.    UXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  O o 9 Z ^ %X*XV.:.W A A W ~ Q -.:.:.>.<.<.;...n k 4 < & # # % # . . . . . . .     .     .                                 . .   . . . . . o o = o o % = = = 8 w w c C ..7.I.(.^.I.I.I.~.I.^.(.].{.{.]. X#X:XSXSX;X#X/.E O   UXUXUXUX      u B.Q.Q.U.U.I.P.P.D.p.p.p.p.p.a.Z.S.S.d.d.p.5.5.5.5.i.i.u.5.>.H C w 0 0 0 0 0 w 0 0 0 0 w q 0 0 w 0 0 w 0 0 0 8 w 8 w w 0 0 w w w 0 w 8 w w 8 8 0 w Z W 2.6.p.a.i.5.1.1.+.1.d.F.P.I.I.(.{..X_./.I.P.~.=XAX-X+X`./.4.# O   UXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  o = y E %X*X!.B.2.W W Q Q Q Q :.:.>.2.<.5.<.1.O.M k j 5 2 & $ $ # # . # # . . . . . . .   . . .   .   . . .   . . . . .   . o . o o % o = % % = 9 = 9 y u N V D :.C.R.(.].(.(.~.I.I.I.~.I.~.).{.[.[. X#X:XSXSX:X.X~       UXUXUXUXUX    X E W.Q.T.K.P.I.I.~.L.Z.a.p.a.Z.d.S.S.F.S.F.S.p.i.5.i.p.i.a.i.i.4.:.W A N N q q w w w w 0 w w w 0 w q 0 0 w w 8 w w w w w w w w w w w w w w N A ~ ~ 2.5.p.a.i.i.u.1.+.N.a.S.J.J.P.P.P.~.{.{.'.^.~.~.`.-X;X:XoX'.Z.& X   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    X y Z y.%X*X!.A.2.:.W Q Q :.:.>.>.2.4.4.5.5.i.u.+.M k l 5 1 2 2 $ % # # . % . . . .   . . . . . . . . . . . . . o . . o o o o * = o = = = = 9 8 u q z C H :.7.U.[.}.].).(.^.^.I.I.I.I.~.~.).[.}.[. X#X:XSXSX:XV.      UXUXUXUXUXUXUX    = E.Y.Y.K.P.P.P.~.~.P.D.a.a.a.Z.S.S.F.F.F.J.L.F.Z.p.i.5.5.1.u.a.a.7.4.>.Q J C w q w w w 0 0 8 2 8 2 8 8 8 8 8 8 8 8 8 8 0 0 w u u u Z A Q 3.6.p.C.a.i.5.u.1.N.1.u.a.D.K.P.J.J.J.K.K.I.'..X_.(.(._.=XAX;X=X'.I.Z     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    o y ^ %X!.!.Y.D.C.>.Q Q -.:.>.>.<.4.5.7.5.5.i.a.i.+.O.M k j 6 2 2 2 & % $ % # # % # # # % . % o . . % % # % o % % % % = = = = = = = y 9 8 u N V J ,.8.H._. X}.[.].].].(.(.^.~.I.I.~.^.).[.[.[.[..X#X:XSX;X@XZ O   UXUXUXUXUXUXUXUX  O - E Y.Y.P.P.P.P.I.I.I.P.L.S.d.S.S.S.S.F.F.F.J.K.K.L.Z.p.5.5.i.i.a.d.a.i.7.<.2.:.Q W W A Z N N N N u w 0 8 8 8 w w w N Z Z Z Z E ~ :.2.6.B.p.p.i.a.a.u.u.1.1.u.S.K.I.I.P.K.J.J.K.K.P.P./._.{.).).#XSXSXSX:X/.:.o O   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    * R y.E.E.!.L.D.Z.7.>.:.:.>.>.4.5.4.5.5.7.p.D.D.S.d.i.N.O.M M k x l 5 5 2 8 5 5 2 & 2 $ & % & & = & & & = = 9 9 9 9 w 9 w u u w N B C H J -.7.U..X X X|.|.|.[.[.[.].).(.^.^.~.~.(.].[.}.[.[.[. X#X;XSX:XR   O   UXUXUXUXUXUXUXUXUX    O ( Y.J.K.P.P.I.I.~.~.~.K.D.S.S.S.S.F.F.J.J.K.P.P.I.L.F.Z.a.p.a.a.a.d.i.d.p.p.p.p.7.6.6.2.3.3.:.! Q Q W H W ~ :.:.3.6.3.6.6.C.B.Z.a.a.p.a.i.i.k.u.u.i.a.D.P.~.(.^.~.I.K.J.K.J.K.K.P.I._.{.]..X:XAXSXSX:X2.#     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    * t ( %X*XA.D.R.L.F.Z.4.>.>.>.<.4.5.7.p.p.Z.Z.S.D.D.F.S.f.d.u.+.O.=.M n v j j j 5 5 5 2 2 8 2 8 2 9 2 8 8 0 8 0 w q N x c D G J -.<.7.A.H.(.}.|.|.|.|.|.|.|.[.].].].).(.(.^.^.(.].[.}.[.}.[.[. X X;XSX( X X   UXUXUXUXUXUXUXUXUXUXUX    O ~ P.I.P.K.P.I.~.~.~.^.~.L.D.S.F.F.J.J.K.P.P.I.I.I.I.K.L.D.Z.a.a.a.d.i.d.d.d.S.d.d.Z.Z.p.p.7.7.7.8.7.p.p.p.7.B.C.p.Z.Z.d.a.a.a.a.d.u.u.u.u.a.d.D.L.I.^.^.^.^.^.~.P.P.K.J.J.J.J.I.^.(.].{..X;XSXSX-X2.=     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX  X   t m.%XA.R.D.D.L.F.F.p.5.<.4.4.5.7.p.Z.Z.S.D.D.D.D.F.F.F.F.G.k.k.N.N.+.O.=.=.n n v k v c v n n v n n n G G G G G ..O.;.1.i.p.R.'. X|.|.|.|.|.|.|.|.|.|.}.}.[.].].).).(.).).[.}.}.}.[.[.[.}.|..X;X| @   O UXUXUXUXUXUXUXUXUXUXUXUXUX    O 3.I.K.K.P.P.I.I.~.^.(.^.P.F.F.L.J.J.K.P.P.P.P.I.I.I.I.I.K.L.D.S.Z.d.d.d.d.d.d.d.f.d.d.d.d.d.a.d.d.S.d.d.a.d.d.d.d.d.d.f.d.a.i.k.s.d.S.D.R.(.).).(.(.^.^.^.~.~.P.P.K.J.J.L.U.^._.).]..X#X;XSXSX8.= O   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    X g y.E.H.D.D.F.L.J.J.D.S.7.5.5.7.p.a.C.Z.D.D.F.F.L.F.F.F.F.F.F.F.F.f.f.f.f.f.u.u.1.1.1.u.u.1.u.1.u.u.u.s.a.d.G.L.U.^.].[.}. X|.|.|.|.|.|.|.|.|.|.|.|.|.}.[.[.[.].].].[.}.}.[.[.[.[.[.[.[.|.#X| O     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    O :.K.P.K.P.P.I.~.~.(.(.(.~.P.J.K.K.P.P.P.P.P.P.I.I.I.I.I.I.I.P.P.L.L.D.D.Z.S.S.S.d.d.d.d.d.d.d.d.d.d.d.d.d.S.S.Z.Z.Z.A.Z.D.R.U.(.].].[.].].).).).).(.^.~.~.~.I.P.K.J.K.~.).).].).]..X:XSXFX%X= O X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      i y.A.D.D.F.J.F.F.J.K.L.Z.p.p.p.C.Z.Z.D.D.R.D.F.F.J.F.J.J.J.K.K.K.J.J.J.F.F.F.F.G.G.F.G.F.G.D.F.L.U.U./._.{.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.}.}.[.[.[.[.[.}.}. X.X(       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    O X :.P.P.P.P.I.~.~.~.^.(.(.(.~.~.P.P.P.P.P.I.I.I.I.P.I.I.P.I.~.~.^.^.~.~./.R.U.R.R.R.H.H.R.H.H.D.H.H.H.R.I.~._.'._.{.$X{. X}.|.|.|.}.[.].).(.(.).(.(.^.^.~.~.I.I.P.I.(.].].).).).{.#X:XSXIXe     UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      g y.H.F.D.F.J.J.J.K.P.P.D.Z.Z.S.S.S.D.D.F.L.F.J.J.J.J.J.K.K.J.K.K.J.K.K.K.K.K.P.P.P.P.I.~.~.^._.).[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.}.}.}.}.[.[.[.[.}.}.|. X~       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      O Q P.P.P.I.I.~.^.^.^.(.).(.^.^.I.P.P.P.P.P.I.P.I.I.I.I.I.I.~.^.(.(.).).].].|.}.[.}.{.[.].[.{.}.}.}.|.}.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].).(.).(.(.^.^.^.~.~.^.^.(.).[.[.].].].].{.#X;XZXd X   UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      i y.A.D.F.J.J.J.K.K.P.I.P.L.L.D.D.R.D.F.F.L.J.J.J.J.J.K.J.K.K.K.K.K.P.P.P.I.~.~.^.^.(.(.).).].].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.}.[.}.}.}.[.[.[.[.[.{.}. X~         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        ~ P.I.P.I.~.~.~.^.^.(.(.(._.).(.^.I.P.I.P.P.P.I.I.I.~.~.~.^.(.(.(.).].].[.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].).).(.(.(.^.^.(.^.(.).].[.[.[.].).].].[.{.:X%Xe       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      y 3.D.F.F.F.J.K.K.K.I.~.I.I.I.L.R.F.F.F.L.J.J.J.J.J.J.J.K.K.K.P.P.I.I.I.~.^.^.(.(._.).).[.[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.}.[.}.[.[.[.}.[.}.|.$X~ X       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        ~ P.I.I.~.~.^.~.~.^.^.(.).].].].).(.^.~.I.I.U.I.I.~.~.^.^.^.(.(.)._.].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.].].].).).(.(.(.(.).).].[.[.[.}.[.].].].].].|.#X%X>       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      % ^ F.F.J.J.J.J.K.K.P.I.I.~.~.I.P.K.K.J.L.J.J.J.J.J.J.K.K.L.K.P.I.I.I.~.^.^.^.(.).).].].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.[.[.[.[.[.].[.[.[.[.|.}.$Xu X       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      . E R.~.~.~.^.~.~.~.~.(.(.(.).[.[.[.].].(.^.^.~.~.~.I.~.^.^.(.(._.].].].[.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.[.[.[.].).).).).).].[.[.[.[.[.].].).].].[.]. X.Xy.@       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        E Z.F.F.J.J.K.K.K.P.I.~.~.^.^.^.^.I.P.P.P.K.K.K.L.K.P.P.K.P.I.P.I.~.^.~.^.(.(.(._.).].[.[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.[.[.[.[.[.[.[.].].[.[.V.=         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    O O u A.~.I.I.~.~.~.^.^.^.(.(.).].[.[.[.}.}.[.{.).(.^.^.^.(.(.).).].[.[.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].].].].].].[.[.[.[.[.[.].].].].].].[.H.(       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      O = 4.F.F.F.J.K.K.K.P.I.~.~.^.^.(.(.^.^.^.~.I.I.P.P.P.P.P.P.P.I.I.I.~.^.^.(.(.)._.].).].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.[.[.[.].[.].[.[.[._.[._.^ O       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        * :.R.~.I.~.~.^.~.^.(.^.).].].[.[.|.|.|.|.|.}.}.].].].).).).].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.[.[.[.[.[.].].].].].[.].].[.].V.>       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        o -.F.J.J.K.K.K.I.I.I.I.^.^.^.(.(.(.(.(.(.(.^.^.^.~.^.~.~.~.~.~.~.^.(.(.(.).].].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.[.].[.].[.[.}.}.}.H.Z         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    X   E C.~.^.^.~.~.^.^.(.(.).].[.}.}.|.|.|.|.|.|.|.|.}.[.}.[.}.}.}.}.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.[.[.[.[.[.[.[.].].].[.].].].].].H.^ %       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX    X   A p.J.K.K.P.P.I.I.I.I.~.^.^.^.(.(.).].].[.{.[.[.[.[.[.].].].].].].].[.[.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.{.}.[.[.[.[.[.[.[.[.].[.}._.^ =         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        % 6.R.~.~.~.^.(.(.).(.).[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.[.[.[.[.].].].[.].[.].].].].[.V.y         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        o Q A.K.K.L.K.P.I.I.I.~.^.~.^.^.(._.].}.}.}.|.}.|.|.|.|.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.{.].[.[.].[.].[._.V.9           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        O u 6.~.^.^.^.^.(.).].].[.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.[.[.[.[.[.[.].].[.].].].].].[.].H.~           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      X 9 ~ D.L.L.K.I.I.~.~.~.^.~.^.^.).).].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.}.[.[.].].].}.).V.Z           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX            E B.~.I.^.(.].].[.}.}.}.}.}.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.].].].[.[.].].[.[.].).(.].H.^ =         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        O u 6.D.P.~.^.^.^.~.~.~.^.(.(.).].[.[.}.}.}.}.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.}.}.|.|.}.].V.Z             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          X E A.(.].}.}.}.}.}.}.|.|.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.|.}.}.[.[.].].[.].].].].[.}.}.[.).$X3.y           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        o Z 3.H.I.~.I.I.~.~.^.(.(.).].{.].}.[.}.}.|.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.].].}.}._.V.E =           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          9 E V._.[.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.].[.[.].[.[.[.].].].}.}.$X^ u           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          O 9 A 3.D.I.~.~.~.^.^._.).].[.[.}.}.}.}.}.}.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}._.V.W y             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          o u W V.$X|.|.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.].].[.].[.|.[.[.$X3.E 9           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX        O   o Z ^ B.H.R.U.~._.[.[.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.{.}.$XV.3.Z o X           UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX              % Z 3.V.$X{.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.].{._.$XV.3.Z           O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX              * y E 3.H.U.(.].|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.$XV.^ u * *             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX      X   X * * y E 3.$X{.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.]._.H.3.~ y =   X         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX              X = u E ^ V.H._.}.}.}.}.}.|.|.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.$X$XV.^ E 9     O             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                . y Z ~ ^ V.$X$X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.].$XV.^ ~ Z 9                 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                . o 9 Z E ^ ^ 3.^ 3.V.V.V.V.V.V.V.V.V.V.V.V.3.^ V.^ E E u t * * *     X         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                * * o 9 y E E ^ ^ ^ V.V.V.V.V.V.V.V.V.V.V.V.V.V.^ 3.^ E E u 9 o X               UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX            X           * X   % = % t = = 9 = = * X         *           X X         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX          X           *         o * * = y = = t o o o X X X                         UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                  X             X           O       X X             UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX              X X                     X   X                   X       UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                                            UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX                                        UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
diff --git a/dists/pegasus/scummpegasus.zip b/dists/pegasus/scummpegasus.zip
new file mode 100644
index 0000000..78a790e
Binary files /dev/null and b/dists/pegasus/scummpegasus.zip differ
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index f0609c1..1a9796e 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -9,13 +9,13 @@
 #define IDI_COUNT 1002
 #define ID_GDF_XML __GDF_XML
 
-IDI_ICON               ICON    DISCARDABLE     "icons/scummvm.ico"
+IDI_ICON               ICON    DISCARDABLE     "dists/pegasus/pegasus.ico"
 IDI_COUNT              ICON    DISCARDABLE     "icons/count.ico"
 
 ID_GDF_XML             DATA    "dists/win32/scummvm.gdf.xml"
 
 scummclassic.zip       FILE    "gui/themes/scummclassic.zip"
-scummmodern.zip        FILE    "gui/themes/scummmodern.zip"
+scummpegasus.zip        FILE    "dists/pegasus/scummpegasus.zip"
 #ifdef USE_TRANSLATION
 translations.dat       FILE    "gui/themes/translations.dat"
 #endif
diff --git a/engines/pegasus/ai/ai_action.cpp b/engines/pegasus/ai/ai_action.cpp
index 38d6390..6f24647 100644
--- a/engines/pegasus/ai/ai_action.cpp
+++ b/engines/pegasus/ai/ai_action.cpp
@@ -45,7 +45,7 @@ AIPlayMessageAction::AIPlayMessageAction(const Common::String &movieName, bool k
 }
 
 void AIPlayMessageAction::performAIAction(AIRule *) {
-	if (g_AIArea) {
+	if (g_AIArea && g_AIArea->isChattyAI()) {
 		g_AIArea->checkMiddleArea();
 		g_AIArea->playAIMovie(kRightAreaSignature, _movieName, _keepLastFrame, _interruptionFilter);
 	}
diff --git a/engines/pegasus/ai/ai_area.cpp b/engines/pegasus/ai/ai_area.cpp
index 5ac8af8..c6aeda8 100644
--- a/engines/pegasus/ai/ai_area.cpp
+++ b/engines/pegasus/ai/ai_area.cpp
@@ -29,6 +29,7 @@
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
 #include "pegasus/items/biochips/aichip.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/biochipitem.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/items/biochips/pegasuschip.h"
@@ -50,6 +51,8 @@ AIArea::AIArea(InputHandler *nextHandler) : InputHandler(nextHandler), _leftArea
 	_middleBiochipTime = 0xffffffff;
 	_rightBiochipTime = 0xffffffff;
 	_lockCount = 0;
+	_chattyAI = true;
+	((PegasusEngine *)g_engine)->requestToggle(false);
 	startIdling();
 }
 
@@ -452,6 +455,10 @@ void AIArea::activateHotspots() {
 			case kOpticalBiochip:
 				((OpticalChip *)currentBiochip)->activateOpticalHotspots();
 				break;
+			case kArthurBiochip:
+				if (vm->isDVD())
+					((ArthurChip *)currentBiochip)->activateArthurHotspots();
+				break;
 			}
 	} else if (_middleAreaOwner == kInventorySignature) {
 		InventoryItem *currentItem = ((PegasusEngine *)g_engine)->getCurrentInventoryItem();
@@ -490,6 +497,12 @@ void AIArea::clickInHotspot(const Input &input, const Hotspot *hotspot) {
 					handled = true;
 				}
 				break;
+			case kArthurBiochip:
+				if (vm->isDVD() && (hotspot->getHotspotFlags() & kArthurBiochipSpotFlag) != 0) {
+					((ArthurChip *)currentBiochip)->clickInArthurHotspot(hotspot->getObjectID());
+					handled = true;
+				}
+				break;
 			}
 		}
 	} else if (_middleAreaOwner == kInventorySignature) {
@@ -533,6 +546,21 @@ void AIArea::forceAIUnlocked() {
 	}
 }
 
+void AIArea::setChattyAI(bool flag) {
+	_chattyAI = flag;
+
+	if (g_arthurChip)
+		g_arthurChip->setUpArthurChip();
+
+	if (flag) {
+		playAIMovie(kRightAreaSignature, "Images/AI/Globals/XGLOB01", false, kHintInterruption);
+	} else {
+		playAIMovie(kRightAreaSignature, "Images/AI/Globals/XGLOB00", false, kHintInterruption);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurDisabledAI);
+	}
+}
+
 void AIArea::checkRules() {
 	if (_lockCount == 0 && ((PegasusEngine *)g_engine)->playerAlive())
 		for (AIRuleList::iterator it = _AIRules.begin(); it != _AIRules.end(); it++)
diff --git a/engines/pegasus/ai/ai_area.h b/engines/pegasus/ai/ai_area.h
index 806e6ef..5541eca 100644
--- a/engines/pegasus/ai/ai_area.h
+++ b/engines/pegasus/ai/ai_area.h
@@ -130,6 +130,9 @@ public:
 	void unlockAI();
 	void forceAIUnlocked();
 
+	bool isChattyAI() { return _chattyAI; }
+	void setChattyAI(bool);
+
 	void checkMiddleArea();
 	void checkRules();
 
@@ -163,6 +166,8 @@ protected:
 	AIRuleList _AIRules;
 
 	uint _lockCount;
+
+	bool _chattyAI;
 };
 
 extern AIArea *g_AIArea;
diff --git a/engines/pegasus/chase.cpp b/engines/pegasus/chase.cpp
new file mode 100644
index 0000000..43f88d3
--- /dev/null
+++ b/engines/pegasus/chase.cpp
@@ -0,0 +1,123 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "pegasus/chase.h"
+
+namespace Pegasus {
+
+// Notification constants.
+
+static const NotificationFlags kChaseNotificationFlags = kChaseEnteredBranchZone |
+															kChaseExitedBranchZone |
+															kChaseFinished;
+
+ChaseInteraction::ChaseInteraction(const InteractionID interactionID, Neighborhood *handler,
+	const NotificationID notificationID, NotificationManager *manager) : GameInteraction(interactionID, handler),
+	_chaseNotification(notificationID, manager), _steerPict(kNoDisplayElement), _directionNeeded(false),
+	_turnDirection(kNoTurn) {
+
+	// HACK HACK HACK HACK HACK
+	// TRIPLE SUPER ULTRA HACK
+	// This avoids a nasty optimization bug I have been unable to track down
+	// after days and days of searching. Let's just ship the game already.
+	setNextHandler(0);
+
+	_neighborhoodNotification = handler->getNeighborhoodNotification();
+}
+
+void ChaseInteraction::openInteraction() {
+	_steerPict.initFromPICTFile("Images/Interface/steer.pict", true);
+
+	_chaseNotification.notifyMe(this, kChaseNotificationFlags, kChaseNotificationFlags);
+
+	_neighborhoodNotification->notifyMe(this, kDelayCompletedFlag | kSpotSoundCompletedFlag,
+										kDelayCompletedFlag | kSpotSoundCompletedFlag);
+}
+
+void ChaseInteraction::closeInteraction() {
+	_steerPict.hide();
+	_steerPict.deallocateSurface();
+
+	_chaseNotification.cancelNotification(this);
+
+	_neighborhoodNotification->cancelNotification(this);
+}
+
+void ChaseInteraction::receiveNotification(Notification *notification, const NotificationFlags flags) {
+	if (notification == &_chaseNotification)
+		switch (flags) {
+		case kChaseEnteredBranchZone:
+			_directionNeeded = true;
+			showControlsHint();
+			setUpBranch();
+			break;
+		case kChaseExitedBranchZone:
+			switch (_turnDirection) {
+			case kTurnLeft:
+				branchLeft();
+				break;
+			case kTurnRight:
+				branchRight();
+				break;
+			case kNoTurn:
+				dontBranch();
+				break;
+			default:
+				break;
+			}
+			hideControlsHint();
+			_turnDirection = kNoTurn;
+			_directionNeeded = false;
+			break;
+		case kChaseFinished:
+			_owner->requestDeleteCurrentInteraction();
+			break;
+		default:
+			break;
+		}
+}
+
+void ChaseInteraction::handleInput(const Input &input, const Hotspot *cursorSpot) {
+	if (input.anyDirectionInput()) {
+		if (_directionNeeded) {
+			if (input.leftButtonAnyDown())
+				_turnDirection = kTurnLeft;
+			else if (input.rightButtonAnyDown())
+				_turnDirection = kTurnRight;
+		}
+	} else {
+		this->InputHandler::handleInput(input, cursorSpot);
+	}
+}
+
+void ChaseInteraction::showControlsHint() {
+	_steerPict.show();
+}
+
+void ChaseInteraction::hideControlsHint() {
+	_steerPict.hide();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/chase.h b/engines/pegasus/chase.h
new file mode 100644
index 0000000..1e9881d
--- /dev/null
+++ b/engines/pegasus/chase.h
@@ -0,0 +1,83 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PEGASUS_CHASE_H
+#define PEGASUS_CHASE_H
+
+#include "pegasus/hotspot.h"
+#include "pegasus/interaction.h"
+#include "pegasus/notification.h"
+#include "pegasus/neighborhood/neighborhood.h"
+
+namespace Pegasus {
+ 
+// Notification constants.
+
+static const NotificationFlags kChaseEnteredBranchZone = 1;
+static const NotificationFlags kChaseExitedBranchZone = kChaseEnteredBranchZone << 1;
+static const NotificationFlags kChaseFinished = kChaseExitedBranchZone << 1;
+
+// Time to choose a direction.
+
+static const TimeValue kDecisionTime = 600 * 2;
+
+class ChaseInteraction : public GameInteraction, public NotificationReceiver {
+public:
+	ChaseInteraction(const InteractionID, Neighborhood *, NotificationID, NotificationManager *);
+	virtual ~ChaseInteraction() {}
+
+	virtual void handleInput(const Input &, const Hotspot *);
+
+protected:
+
+	virtual void openInteraction();
+	virtual void initInteraction() {}
+	virtual void closeInteraction();
+
+	virtual void receiveNotification(Notification *, const NotificationFlags);
+
+	virtual void setUpBranch() {}
+	virtual void branchLeft() {}
+	virtual void branchRight() {}
+	virtual void dontBranch() {}
+
+	virtual void showControlsHint();
+	virtual void hideControlsHint();
+
+	Notification _chaseNotification;
+
+	Notification *_neighborhoodNotification;
+
+	Picture _steerPict;
+
+private:
+
+	bool _directionNeeded;
+	TurnDirection _turnDirection;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/constants.h b/engines/pegasus/constants.h
index f81d219..76fabe8 100644
--- a/engines/pegasus/constants.h
+++ b/engines/pegasus/constants.h
@@ -379,12 +379,15 @@ static const NotificationID kNoradPressureNotificationID = kNoradFillingStationN
 static const NotificationID kNoradUtilityNotificationID = kNoradPressureNotificationID + 1;
 static const NotificationID kNoradElevatorNotificationID = kNoradUtilityNotificationID + 1;
 static const NotificationID kNoradSubPlatformNotificationID = kNoradElevatorNotificationID + 1;
-static const NotificationID kSubControlNotificationID = kNoradSubPlatformNotificationID + 1;
+static const NotificationID kNoradSubChaseNotificationID = kNoradSubPlatformNotificationID + 1;
+static const NotificationID kSubControlNotificationID = kNoradSubChaseNotificationID + 1;
 static const NotificationID kNoradGreenBallNotificationID = kSubControlNotificationID + 1;
 static const NotificationID kNoradGlobeNotificationID = kNoradGreenBallNotificationID + 1;
 static const NotificationID kCaldoriaVidPhoneNotificationID = kNoradGlobeNotificationID + 1;
 static const NotificationID kCaldoriaMessagesNotificationID = kCaldoriaVidPhoneNotificationID + 1;
 static const NotificationID kCaldoriaBombTimerNotificationID = kCaldoriaMessagesNotificationID + 1;
+static const NotificationID kMarsTunnelPodNotificationID = kCaldoriaBombTimerNotificationID + 1;
+static const NotificationID kMarsCanyonChaseNotificationID = kMarsTunnelPodNotificationID + 1;
 
 // Sent to the shell by fShellNotification.
 static const NotificationFlags kGameStartingFlag = 1;
@@ -463,7 +466,12 @@ static const HotSpotID kAISolveSpotID = kAIHint3SpotID + 1;
 static const HotSpotID kAIBriefingSpotID = kAISolveSpotID + 1;
 static const HotSpotID kAIScanSpotID = kAIBriefingSpotID + 1;
 
-static const HotSpotID kPegasusRecallSpotID = kAIScanSpotID + 1;
+static const HotSpotID kArthurWisdomSpotID = kAIScanSpotID + 1;
+static const HotSpotID kChattyArthurSpotID = kArthurWisdomSpotID + 1;
+static const HotSpotID kChattyAISpotID = kChattyArthurSpotID + 1;
+static const HotSpotID kArthurHeadSpotID = kChattyAISpotID + 1;
+
+static const HotSpotID kPegasusRecallSpotID = kArthurHeadSpotID + 1;
 
 static const HotSpotID kAriesSpotID = kPegasusRecallSpotID + 1;
 static const HotSpotID kMercurySpotID = kAriesSpotID + 1;
@@ -501,7 +509,8 @@ static const HotSpotFlags kInfoReturnSpotFlag = kDropBiochipSpotFlag << 1;
 // Biochip and inventory hot spot flags...
 
 static const HotSpotFlags kAIBiochipSpotFlag = kInfoReturnSpotFlag << 1;
-static const HotSpotFlags kPegasusBiochipSpotFlag = kAIBiochipSpotFlag << 1;
+static const HotSpotFlags kArthurBiochipSpotFlag = kAIBiochipSpotFlag << 1;
+static const HotSpotFlags kPegasusBiochipSpotFlag = kArthurBiochipSpotFlag << 1;
 static const HotSpotFlags kOpticalBiochipSpotFlag = kPegasusBiochipSpotFlag << 1;
 static const HotSpotFlags kAirMaskSpotFlag = kOpticalBiochipSpotFlag << 1;
 
@@ -510,6 +519,7 @@ static const HotSpotFlags kJMPClickingSpotFlags = kClickSpotFlag |
 											kOpenDoorSpotFlag |
 											kInfoReturnSpotFlag |
 											kAIBiochipSpotFlag |
+											kArthurBiochipSpotFlag |
 											kPegasusBiochipSpotFlag |
 											kOpticalBiochipSpotFlag |
 											kAirMaskSpotFlag;
@@ -655,6 +665,7 @@ enum {
 	// Mars
 	kDeathWrongShuttleLock,
 	kDeathArrestedInMars,
+	kDeathCollidedWithPod,
 	kDeathRunOverByPod,
 	kDeathDidntGetOutOfWay,
 	kDeathReactorBurn,
diff --git a/engines/pegasus/cursor.cpp b/engines/pegasus/cursor.cpp
index ad0d2c2..f0976e2 100644
--- a/engines/pegasus/cursor.cpp
+++ b/engines/pegasus/cursor.cpp
@@ -160,6 +160,7 @@ void Cursor::loadCursorImage(CursorInfo &cursorInfo) {
 
 	cursorInfo.surface = new Graphics::Surface();
 
+	// The CD version uses (only) lower color cicn images for its cursors
 	Common::SeekableReadStream *cicnStream = vm->_resFork->getResource(MKTAG('c', 'i', 'c', 'n'), cursorInfo.tag);
 
 	if (!cicnStream)
diff --git a/engines/pegasus/detection.cpp b/engines/pegasus/detection.cpp
old mode 100644
new mode 100755
index 721c382..ac234c2
--- a/engines/pegasus/detection.cpp
+++ b/engines/pegasus/detection.cpp
@@ -41,8 +41,8 @@ enum {
 
 bool PegasusEngine::hasFeature(EngineFeature f) const {
 	return
-		(f == kSupportsRTL)
-		|| (f == kSupportsLoadingDuringRuntime)
+		/* (f == kSupportsRTL)
+		|| */ (f == kSupportsLoadingDuringRuntime)
 		|| (f == kSupportsSavingDuringRuntime);
 }
 
@@ -66,6 +66,10 @@ bool PegasusEngine::isWindows() const {
 	return _gameDescription->desc.platform == Common::kPlatformWindows;
 }
 
+bool PegasusEngine::isLinux() const {
+	return _gameDescription->desc.platform == Common::kPlatformLinux;
+}
+
 } // End of namespace Pegasus
 
 static const PlainGameDescriptor pegasusGames[] = {
@@ -92,6 +96,53 @@ static const PegasusGameDescription gameDescriptions[] = {
 	{
 		{
 			"pegasus",
+			"DVD",
+			AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337),
+			Common::EN_ANY,
+			Common::kPlatformMacintosh,
+			ADGF_MACRESFORK|GF_DVD,
+			GUIO0()
+		},
+	},
+	
+	{
+		{	"pegasus",
+			"DVD",
+			AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_MACRESFORK|GF_DVD,
+			GUIO0()
+		},
+	},
+
+	{
+		{
+			"pegasus",
+			"DVD",
+			AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_MACRESFORK|GF_DVD,
+			GUIO0()
+		},
+	},
+
+	{
+		{
+			"pegasus",
+			"DVD",
+			AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337),
+			Common::EN_ANY,
+			Common::kPlatformLinux,
+			ADGF_MACRESFORK|GF_DVD,
+			GUIO0()
+		},
+	},
+
+	{
+		{
+			"pegasus",
 			"Demo",
 			AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 360129),
 			Common::EN_ANY,
@@ -113,7 +164,7 @@ static const PegasusGameDescription gameDescriptions[] = {
 		},
 	},
 
-		{
+	{
 		{
 			"pegasus",
 			"DVD Demo",
diff --git a/engines/pegasus/graphics.cpp b/engines/pegasus/graphics.cpp
index 5475108..fc22bb5 100644
--- a/engines/pegasus/graphics.cpp
+++ b/engines/pegasus/graphics.cpp
@@ -23,6 +23,7 @@
  *
  */
 
+#include "common/config-manager.h"
 #include "common/events.h"
 #include "common/file.h"
 #include "common/textconsole.h"
diff --git a/engines/pegasus/input.cpp b/engines/pegasus/input.cpp
index b74e4a4..6ad9905 100644
--- a/engines/pegasus/input.cpp
+++ b/engines/pegasus/input.cpp
@@ -64,10 +64,12 @@ InputDeviceManager::InputDeviceManager() {
 	_keyMap[Common::KEYCODE_RALT] = false;
 	_keyMap[Common::KEYCODE_e] = false;
 	_keyMap[Common::KEYCODE_KP_ENTER] = false;
+	_keyMap[Common::KEYCODE_a] = false;
 
 	g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 2, false);
 	_lastRawBits = kAllUpBits;
 	_consoleRequested = false;
+	_AKeyWasDown = false;
 }
 
 InputDeviceManager::~InputDeviceManager() {
@@ -75,19 +77,31 @@ InputDeviceManager::~InputDeviceManager() {
 }
 
 void InputDeviceManager::getInput(Input &input, const InputBits filter) {
-	// Poll for events, but ignore them!
-	// We'll pick them up in notifyEvent()
+	// Poll for events, but ignore most of them!
+	// We'll pick the rest up in notifyEvent()
 	// We do that so that any pollEvent() call can update the variables
 	// (ie. if one uses enter to access the restore menu, we never receive
 	// the key up event, which leads to bad things)
 	// This is to closely emulate what the GetKeys() function did on Mac OS
-	Common::Event event;
-	while (g_system->getEventManager()->pollEvent(event))
-		;
 
-	// Now create the bitfield
 	InputBits currentBits = 0;
 
+	Common::Event event;
+	while (g_system->getEventManager()->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_WHEELUP:
+			currentBits |= (kRawButtonDown << kUpButtonShift);
+			break;
+		case Common::EVENT_WHEELDOWN:
+			currentBits |= (kRawButtonDown << kDownButtonShift);
+			break;
+		default:
+			break;
+		}
+	}
+
+	// Now fill in the rest of the bitfield
+
 	if (_keyMap[Common::KEYCODE_UP] || _keyMap[Common::KEYCODE_KP8])
 		currentBits |= (kRawButtonDown << kUpButtonShift);
 
@@ -121,6 +135,14 @@ void InputDeviceManager::getInput(Input &input, const InputBits filter) {
 	if (_keyMap[Common::KEYCODE_BACKSPACE] || _keyMap[Common::KEYCODE_KP_MULTIPLY])
 		currentBits |= (kRawButtonDown << kRightFireButtonShift);
 
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		if (_keyMap[Common::KEYCODE_a] && (_keyMap[Common::KEYCODE_LALT] || _keyMap[Common::KEYCODE_RALT]) && !_AKeyWasDown) {
+			((PegasusEngine *)g_engine)->requestToggle();
+			_AKeyWasDown = true;
+		} else if (!_keyMap[Common::KEYCODE_a])
+			_AKeyWasDown = false;
+	}
+
 	// Update mouse button state
 	// Note that we don't use EVENT_LBUTTONUP/EVENT_LBUTTONDOWN because
 	// they do not show if the button is being held down. We're treating
diff --git a/engines/pegasus/input.h b/engines/pegasus/input.h
index 3e938fa..e2c814a 100644
--- a/engines/pegasus/input.h
+++ b/engines/pegasus/input.h
@@ -57,6 +57,7 @@ protected:
 	Common::HashMap<uint, bool> _keyMap;
 	InputBits _lastRawBits;
 	bool _consoleRequested;
+	bool _AKeyWasDown;
 };
 
 enum {
@@ -278,7 +279,7 @@ enum {
 };
 
 static const InputBits kHintInterruption = kFilterAllInputNoAuto;
-static const InputBits kWarningInterruption = kFilterNoInput;
+static const InputBits kWarningInterruption = kFilterAllInputNoAuto;
 static const InputBits kOpticalInterruption = kFilterAllInputNoAuto;
 
 /*
@@ -481,7 +482,7 @@ public:
 
 	static bool isRaiseInventoryInput(const Input &input) { return input.leftFireButtonDown(); }
 	static bool isRaiseBiochipsInput(const Input &input) { return input.rightFireButtonDown(); }
-	static InputBits getItemPanelsInputFilter() { return kFilterLeftFireButton | kFilterRightFireButton; }
+	static InputBits getItemPanelsInputFilter() { return kFilterFourButton | kFilterLeftFireButton | kFilterRightFireButton; }
 
 	static bool isToggleAIMiddleInput(const Input &input) { return input.threeButtonDown(); }
 
diff --git a/engines/pegasus/interface.cpp b/engines/pegasus/interface.cpp
index f2429bf..5543672 100644
--- a/engines/pegasus/interface.cpp
+++ b/engines/pegasus/interface.cpp
@@ -398,6 +398,7 @@ void Interface::raiseInventoryDrawer(const bool doCallBacks) {
 
 	if (((PegasusEngine *)g_engine)->isDVD()) {
 		_inventoryCloseSound.stopSound();
+		_inventoryOpenSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
 		_inventoryOpenSound.playSound();
 	}
 }
@@ -412,6 +413,15 @@ void Interface::playEndMessage() {
 
 void Interface::raiseInventoryDrawerForMessage() {
 	_inventoryPanel.disableLooping();
+
+	// The DVD version has a different image for the inventory
+	// for the end message.
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		_inventoryPanel.setCommPicture();
+		_inventoryPanel.throwAwayInventoryImage();
+		_inventoryPanel.initInventoryImage(&_inventoryPush);
+	}
+
 	raiseInventoryDrawerSync();
 }
 
@@ -464,6 +474,7 @@ void Interface::lowerInventoryDrawer(const bool doCallBacks) {
 
 		if (((PegasusEngine *)g_engine)->isDVD()) {
 			_inventoryOpenSound.stopSound();
+			_inventoryCloseSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
 			_inventoryCloseSound.playSound();
 		}
 	}
@@ -510,6 +521,7 @@ void Interface::raiseBiochipDrawer(const bool doCallBacks) {
 
 	if (((PegasusEngine *)g_engine)->isDVD()) {
 		_biochipCloseSound.stopSound();
+		_biochipOpenSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
 		_biochipOpenSound.playSound();
 	}
 }
diff --git a/engines/pegasus/items/biochips/arthurchip.cpp b/engines/pegasus/items/biochips/arthurchip.cpp
new file mode 100644
index 0000000..931f1de
--- /dev/null
+++ b/engines/pegasus/items/biochips/arthurchip.cpp
@@ -0,0 +1,288 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-1997 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "pegasus/pegasus.h"
+#include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
+
+namespace Common {
+DECLARE_SINGLETON(Pegasus::ArthurManager);
+}
+
+namespace Pegasus {
+
+static const char *kArthurWisdomMovies[] = {
+	"Images/AI/Globals/XGLOBA01",
+	"Images/AI/Globals/XGLOBA03",
+	"Images/AI/Globals/XGLOBA06",
+	"Images/AI/Globals/XGLOBA07",
+	"Images/AI/Globals/XGLOBA09",
+	"Images/AI/Globals/XGLOBA17",
+	"Images/AI/Globals/XGLOBA18",
+	"Images/AI/Globals/XGLOBA25",
+	"Images/AI/Globals/XGLOBA26",
+	"Images/AI/Globals/XGLOBA27",
+	"Images/AI/Globals/XGLOBA28",
+	"Images/AI/Globals/XGLOBA30",
+	"Images/AI/Globals/XGLOBA34",
+	"Images/AI/Globals/XGLOBA35",
+	"Images/AI/Globals/XGLOBA43",
+	"Images/AI/Globals/XGLOBA50",
+	"Images/AI/Globals/XGLOBA56",
+	"Images/AI/Globals/XGLOBA59",
+	"Images/AI/Globals/XGLOBA63",
+	"Images/AI/Globals/XGLOBB10",
+	"Images/AI/Globals/XGLOBB11",
+	"Images/AI/Globals/XGLOBB12",
+	"Images/AI/Globals/XGLOBB13",
+	"Images/AI/Globals/XGLOBB14",
+	"Images/AI/Globals/XGLOBB15",
+	"Images/AI/Globals/XGLOBB16",
+	"Images/AI/Globals/XGLOBB17",
+	"Images/AI/Globals/XGLOBB18",
+	"Images/AI/Globals/XGLOBB19",
+	"Images/AI/Globals/XGLOBB20",
+	"Images/AI/Globals/XGLOBB21",
+	"Images/AI/Globals/XGLOBB22",
+	"Images/AI/Globals/XGLOBB23",
+	"Images/AI/Globals/XGLOBB24",
+	"Images/AI/Globals/XGLOBB25",
+	"Images/AI/Globals/XGLOBB26",
+	"Images/AI/Globals/XGLOBB27",
+	"Images/AI/Globals/XGLOBB28",
+	"Images/AI/Globals/XGLOBB29",
+	"Images/AI/Globals/XGLOBB30",
+	"Images/AI/Globals/XGLOBB31",
+	"Images/AI/Globals/XGLOBB32",
+	"Images/AI/Globals/XGLOBB33",
+	"Images/AI/Globals/XGLOBB34",
+	"Images/AI/Globals/XGLOBB35",
+	"Images/AI/Globals/XGLOBB36",
+	"Images/AI/Globals/XGLOBB37",
+	"Images/AI/Globals/XGLOBB38",
+	"Images/AI/Globals/XGLOBB39",
+	"Images/AI/Globals/XGLOBB43",
+	"Images/AI/Globals/XGLOBB44",
+	"Images/AI/Globals/XGLOBA62"
+};
+
+ArthurChip *g_arthurChip = 0;
+
+ArthurChip::ArthurChip(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) :
+		BiochipItem(id, neighborhood, room, direction), _arthurWisdomHotspot(kArthurWisdomSpotID),
+		_chattyArthurHotspot(kChattyArthurSpotID), _chattyAIHotspot(kChattyAISpotID),
+		_arthurHeadHotspot(kArthurHeadSpotID) {
+	_chattyArthur = true;
+	_lastArthurMovie = "";
+
+	_arthurWisdomHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 20, kAIMiddleAreaTop + 27, kAIMiddleAreaLeft + 20 + 161, kAIMiddleAreaTop + 27 + 30));
+	_arthurWisdomHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
+	g_allHotspots.push_back(&_arthurWisdomHotspot);
+
+	_chattyArthurHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 100, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 100 + 20, kAIMiddleAreaTop + 67 + 20));
+	_chattyArthurHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
+	g_allHotspots.push_back(&_chattyArthurHotspot);
+
+	_chattyAIHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 130, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 130 + 20, kAIMiddleAreaTop + 67 + 20));
+	_chattyAIHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
+	g_allHotspots.push_back(&_chattyAIHotspot);
+
+	_arthurHeadHotspot.setArea(Common::Rect(kAIRightAreaLeft, kAIRightAreaTop, kAIRightAreaLeft + kAIRightAreaWidth, kAIRightAreaTop + kAIRightAreaHeight));
+	_arthurHeadHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
+	g_allHotspots.push_back(&_arthurHeadHotspot);
+
+	setItemState(kArthur000);
+
+	g_arthurChip = this;
+}
+
+ArthurChip::~ArthurChip() {
+	g_arthurChip = NULL;
+
+	g_allHotspots.removeOneHotspot(kArthurWisdomSpotID);
+	g_allHotspots.removeOneHotspot(kChattyArthurSpotID);
+	g_allHotspots.removeOneHotspot(kChattyAISpotID);
+	g_allHotspots.removeOneHotspot(kArthurHeadSpotID);
+}
+
+void ArthurChip::setChattyArthur(bool flag) {
+	_chattyArthur = flag;
+
+	setUpArthurChip();
+
+	if (flag) {
+		if (((PegasusEngine *)g_engine)->getRandomBit())
+			playArthurMovie("Images/AI/Globals/XGLOBAA1");
+		else
+			playArthurMovie("Images/AI/Globals/XGLOBAA2");
+	} else {
+		playArthurMovie("Images/AI/Globals/XGLOBAA0");
+	}
+}
+
+void ArthurChip::select() {
+	BiochipItem::select();
+	setUpArthurChip();
+}
+
+void ArthurChip::setUpArthurChip() {
+	ItemState state = getItemState();
+
+	if (_chattyArthur) {
+		if (g_AIArea && g_AIArea->isChattyAI()) {
+			if (state != kArthur002)
+				setItemState(kArthur000);
+		} else if (state != kArthur102) {
+			setItemState(kArthur100);
+		}
+	} else {
+		if (g_AIArea && g_AIArea->isChattyAI()) {
+			if (state != kArthur012)
+				setItemState(kArthur010);
+		} else if (state != kArthur112) {
+			setItemState(kArthur110);
+		}
+	}
+}
+
+void ArthurChip::activateArthurHotspots() {
+	_arthurWisdomHotspot.setActive();
+	_chattyArthurHotspot.setActive();
+	_chattyAIHotspot.setActive();
+	_arthurHeadHotspot.setActive();
+}
+
+void ArthurChip::clickInArthurHotspot(HotSpotID id) {
+	ItemState state, newState;
+
+	if (id == kArthurHeadSpotID) {
+		if (_lastArthurMovie != "")
+			playArthurMovie(_lastArthurMovie);
+		return;
+	}
+	
+	newState = state = getItemState();
+	switch (state) {
+	case kArthur000:
+		switch (id) {
+		case kArthurWisdomSpotID:
+			newState = kArthur002;
+			break;
+		case kChattyArthurSpotID:
+			newState = kArthur010;
+			break;
+		case kChattyAISpotID:
+			newState = kArthur100;
+			break;
+		}
+		break;
+	case kArthur010:
+		switch (id) {
+		case kArthurWisdomSpotID:
+			newState = kArthur012;
+			break;
+		case kChattyArthurSpotID:
+			newState = kArthur000;
+			break;
+		case kChattyAISpotID:
+			newState = kArthur110;
+			break;
+		}
+		break;
+	case kArthur100:
+		switch (id) {
+		case kArthurWisdomSpotID:
+			newState = kArthur102;
+			break;
+		case kChattyArthurSpotID:
+			newState = kArthur110;
+			break;
+		case kChattyAISpotID:
+			newState = kArthur010;
+			break;
+		}
+		break;
+	case kArthur110:
+		switch (id) {
+		case kArthurWisdomSpotID:
+			newState = kArthur112;
+			break;
+		case kChattyArthurSpotID:
+			newState = kArthur100;
+			break;
+		case kChattyAISpotID:
+			newState = kArthur010;
+			break;
+		}
+		break;
+	}
+	setItemState(newState);
+	switch (id) {
+	case kArthurWisdomSpotID:
+		playArthurMovie(kArthurWisdomMovies[((PegasusEngine *)g_engine)->getRandomNumber((
+						sizeof(kArthurWisdomMovies) / sizeof(const char *)) - 1)]);
+		break;
+	case kChattyArthurSpotID:
+		setChattyArthur(!_chattyArthur);
+		break;
+	case kChattyAISpotID:
+		if (g_AIArea)
+			g_AIArea->setChattyAI(!g_AIArea->isChattyAI());
+		break;
+	}
+	
+	setItemState(state);
+}
+
+void ArthurChip::playArthurMovie(const Common::String &movieName) {
+	if (g_AIArea) {
+		g_AIArea->playAIMovie(kRightAreaSignature, movieName, false, kHintInterruption);
+		if (movieName != "Images/AI/Globals/XGLOB00" &&
+			movieName != "Images/AI/Globals/XGLOB01" &&
+			movieName != "Images/AI/Globals/XGLOBAA0" &&
+			movieName != "Images/AI/Globals/XGLOBAA1" &&
+			movieName != "Images/AI/Globals/XGLOBAA2")
+			_lastArthurMovie = movieName;
+	}
+}
+
+bool ArthurChip::playArthurMovieForEvent(const Common::String &movieName, ArthurEvent event) {
+	if (((PegasusEngine *)g_engine)->isDVD() && ((PegasusEngine *)g_engine)->playerHasItemID(kArthurBiochip) &&
+		isChattyArthur() && !Arthur._arthurFlags.getFlag(event)) {
+		Arthur._arthurFlags.setFlag(event, true);
+		playArthurMovie(movieName);
+		return true;
+	} else {
+		return false;
+	}
+}
+
+void ArthurManager::resetArthurState() {
+	bool savedGameFlag = _arthurFlags.getFlag(kArthurLoadedSavedGame);
+	_arthurFlags.clearAllFlags();
+	_arthurFlags.setFlag(kArthurLoadedSavedGame, savedGameFlag);
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/items/biochips/arthurchip.h b/engines/pegasus/items/biochips/arthurchip.h
new file mode 100644
index 0000000..4c4a580
--- /dev/null
+++ b/engines/pegasus/items/biochips/arthurchip.h
@@ -0,0 +1,226 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-1997 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PEGASUS_ITEMS_BIOCHIPS_ARTHURCHIP_H
+#define PEGASUS_ITEMS_BIOCHIPS_ARTHURCHIP_H
+
+#include "pegasus/hotspot.h"
+#include "pegasus/util.h"
+#include "pegasus/items/biochips/biochipitem.h"
+
+namespace Pegasus {
+
+enum ArthurEvent {
+	kArthurLoadedSavedGame,
+	kArthurAttemptedLockedDoor,
+	kArthurAttemptedLockedDoorAgain,
+	kArthurDestroyedInventoryItem,
+	kArthurDisabledAI,
+
+	kArthurCaldoriaFinishedJoyride,
+	kArthurCaldoriaSelectedStickyBuns,
+	kArthurCaldoriaCreatedCornbread,
+	kArthurCaldoriaDrankOJ,
+	kArthurCaldoriaZoomedToLaundry,
+	kArthurCaldoriaReachedToilet,
+	kArthurCaldoriaReadPaper,
+	kArthurCaldoriaChoseAgencyHairStyle,
+	kArthurCaldoriaSawVacantApartment,
+	kArthurCaldoriaLookThroughTelescope,
+	kArthurCaldoriaRoofDoor,
+	kArthurCaldoriaUsedCardBomb,
+	kArthurCaldoriaBlownDoor,
+	kArthurCaldoriaSawVoiceAnalysis,
+	kArthurCaldoriaStunningSinclair,
+	kArthurCaldoriaSeeRoofBomb,
+	kArthurCaldoriaDisarmedNuke,
+
+	kArthurTSAEnteredCave,
+	kArthurTSASawAgent3,
+	kArthurTSASawBust,
+	kArthurTSAReachedJunction,
+	kArthurTSAClickedRobot1,
+	kArthurTSAClickedRobot2,
+	kArthurTSAOpenTBPMonitor,
+	kArthurTSASawJourneymanKey,
+	kArthurTSASawBiochips,
+	kArthurTSAUsedPegasus,
+	kArthurTSAConfinedByBaldwin,
+	kArthurTSARedirectedRobots,
+	kArthurTSAUsedTurbolift,
+	kArthurTSASawFirstOpMemMovie,
+	kArthurTSAInPegasusNoVideo,
+	kArthurTSASawBaldwinSayGo,
+	kArthurTSALeaving,
+
+	kArthurGoToPrehistoric,
+	
+	kArthurPrehistoricReachedJunction,
+	kArthurPrehistoricSawBreaker,
+	kArthurPrehistoricBreakerThrown,
+	kArthurPrehistoricAtCliffEdge,
+	kArthurPrehistoricSawEggs,
+	kArthurPrehistoricZoomedToVault,
+	kArthurPrehistoricAttemptedBridge,
+	kArthurPrehistoricExtendedBridge,
+	kArthurPrehistoricCrossedBridge,
+	kArthurPrehistoricUnlockedVault,
+
+	kArthurMarsReadyForKiosk,
+	kArthurMarsLookedAtGuards,
+	kArthurMarsZoomedToKeyCard,
+	kArthurMarsTurnedOnTransport,
+	kArthurMarsCantFillMask,
+	kArthurMarsSawWelcomeVideos,
+	kArthurMarsRobotThrownPlayerWithMask,
+	kArthurMarsLeftPodNoCrowBar,
+	kArthurMarsLookAtEmptyTracks,
+	kArthurMarsEnteredReactor,
+	kArthurMarsSawLockedPanel,
+	kArthurMarsSawLockedPanelNoNitrogen,
+	kArthurMarsUsedLiquidNitrogen,
+	kArthurMarsFoundCardBomb,
+	kArthurMarsSolvedReactorGame,
+	kArthurMarsDeactivatedCardBomb,
+	kArthurMarsExitedReactorWithCardBomb,
+	kArthurMarsInAirlockNoOxygen,
+	kArthurMarsMazeReachedJunction,
+	kArthurMarsOxygen50Warning,
+	kArthurMarsOxygen25Warning,
+	kArthurMarsOxygen5Warning,
+	kArthurMarsFoundBuckets,
+	kArthurMarsApproachedBuckets,
+	kArthurMarsEnteredGearRoom,
+	kArthurMarsLookAtGears,
+	kArthurMarsExitedGearRoom,
+	kArthurMarsFoundNoShuttlePresent,
+	kArthurMarsEnteredShuttle,
+	kArthurMarsFoundDeadRobot,
+	kArthurMarsRobotHeadOpen,
+
+	kArthurWSCRemovedDart,
+	kArthurWSCPoisonedDuringGame,
+	kArthurWSCFailedMolecule,
+	kArthurWSCDesignedAntidote,
+	kArthurWSCSawAresHologram,
+	kArthurWSCLookAtMorphExperiment,
+	kArthurWSCStartMorphExperiment,
+	kArthurWSCSawMorphExperiment,
+	kArthurWSCLeftLabNoKeyOrCanisters,
+	kArthurWSCAtOppositeDoor,
+	kArthurWSCReadyForMap,
+	kArthurWSCAttemptedLockedDoor,
+	kArthurWSCSawSinclairDoor,
+	kArthurWSCSawSinclairDoorNoKey,
+	kArthurWSCAttemptedSinclairDoorNoKey,
+	kArthurWSCZoomedToSnake,
+	kArthurWSCActivatedComputer,
+	kArthurWSCZoomedToSinclairMessages,
+	kArthurWSCPlayedEasterEggMessage,
+	kArthurWSCGotMachineGun,
+	kArthurWSCSeenNerd,
+	kArthurWSCSawBrokenDoor,
+	kArthurWSCSawBrokenDoorNoCrowBar,
+	kArthurWSCUsedCrowBar,
+	kArthurWSCDidPlasmaDodge,
+	kArthurWSCEnteredAuditorium,
+	kArthurWSCSawSinclairLecture,
+	kArthurWSCEnteredPassage,
+	kArthurWSCInPassage,
+	kArthurWSCExitedPassage,
+	kArthurWSCSawCatwalkDoor,
+	kArthurWSCRobotHeadOpen,
+
+	kArthurNoradAtSecurityMonitor,
+	kArthurNoradSawFillingStation,
+	kArthurNoradSawIntakeWarning,
+	kArthurNoradDidntFillCanisters,
+	kArthurNoradSawUnconsciousOperator,
+	kArthurNoradAttemptedLockedDoor,
+	kArthurNoradAttemptedLockedDoorAgain,
+	kArthurNoradReachedPressureDoor,
+	kArthurNoradSawSubMessage,
+	kArthurNoradSawClawMonitor,
+	kArthurNoradPlayedWithClaw,
+	kArthurNoradEnteredSub,
+	kArthurNoradExitedSub,
+	kArthurNoradApproachedDamagedDoor,
+	kArthurNoradAtRetScanNoBiochip,
+	kArthurNoradStartGlobeGame,
+	kArthurNoradSelectedIncorrectSilo,
+	kArthurNoradFinishedGlobeGame,
+	kArthurNoradThreatenedByRobot,
+	kArthurNoradBeatRobotWithClaw,
+	kArthurNoradRobotHeadOpen,
+	
+	kNumArthurFlags
+};
+
+class ArthurChip : public BiochipItem {
+public:
+	ArthurChip(const ItemID, const NeighborhoodID, const RoomID, const DirectionConstant);
+	virtual ~ArthurChip();
+
+	bool isChattyArthur() { return _chattyArthur; }
+	void setChattyArthur(bool);
+
+	void select();
+
+	void setUpArthurChip();
+	void activateArthurHotspots();
+	void clickInArthurHotspot(HotSpotID);
+	void playArthurMovie(const Common::String &);
+	bool playArthurMovieForEvent(const Common::String &, ArthurEvent event);
+
+protected:
+	Hotspot _arthurWisdomHotspot;
+	Hotspot _chattyArthurHotspot;
+	Hotspot _chattyAIHotspot;
+	Hotspot _arthurHeadHotspot;
+	bool _chattyArthur;
+	Common::String _lastArthurMovie;
+};
+
+class ArthurManager : public Common::Singleton<ArthurManager> {
+public:
+	ArthurManager() { resetArthurState(); }
+
+	void resetArthurState();
+
+protected:
+	friend class Common::Singleton<SingletonBaseType>;
+	friend class ArthurChip;
+
+private:
+	FlagsArray<byte, kNumArthurFlags> _arthurFlags;
+};
+
+extern ArthurChip *g_arthurChip;
+
+} // End of namespace Pegasus
+
+#define Arthur (::Pegasus::ArthurManager::instance())
+
+#endif
diff --git a/engines/pegasus/items/biochips/opticalchip.cpp b/engines/pegasus/items/biochips/opticalchip.cpp
index 7b8858e..05121ac 100644
--- a/engines/pegasus/items/biochips/opticalchip.cpp
+++ b/engines/pegasus/items/biochips/opticalchip.cpp
@@ -127,7 +127,16 @@ void OpticalChip::playOpMemMovie(HotSpotID id) {
 	Common::String movieName;
 	switch (id) {
 	case kAriesSpotID:
-		movieName = "Images/AI/Globals/OMAI";
+		// WORKAROUND: The original CD release played the ares video even
+		// when you destroyed the shuttle. For the DVD release, we have
+		// some new videos that can be played instead to workaround a plot
+		// loophole.
+		if (!((PegasusEngine *)g_engine)->isDVD() || _opticalFlags.getFlag(kOpticalAriesExposed))
+			movieName = "Images/AI/Globals/OMAI";
+		else if (_itemOwnerID == kPlayerID)
+			movieName = "Images/AI/Globals/OMN1";
+		else
+			movieName = "Images/AI/Globals/OMN0";
 		break;
 	case kMercurySpotID:
 		movieName = "Images/AI/Globals/OMMI";
diff --git a/engines/pegasus/items/inventory/airmask.cpp b/engines/pegasus/items/inventory/airmask.cpp
index c65dd36..26912bb 100644
--- a/engines/pegasus/items/inventory/airmask.cpp
+++ b/engines/pegasus/items/inventory/airmask.cpp
@@ -164,17 +164,17 @@ void AirMask::useIdleTime() {
 
 void AirMask::refillAirMask() {
 	switch (getItemState()) {
-		case kAirMaskEmptyOff:
-		case kAirMaskLowOff:
-			setItemState(kAirMaskFullOff);
-			break;
-		case kAirMaskEmptyFilter:
-		case kAirMaskLowFilter:
-			setItemState(kAirMaskFullFilter);
-			break;
-		case kAirMaskLowOn:
-			setItemState(kAirMaskFullOn);
-			break;
+	case kAirMaskEmptyOff:
+	case kAirMaskLowOff:
+		setItemState(kAirMaskFullOff);
+		break;
+	case kAirMaskEmptyFilter:
+	case kAirMaskLowFilter:
+		setItemState(kAirMaskFullFilter);
+		break;
+	case kAirMaskLowOn:
+		setItemState(kAirMaskFullOn);
+		break;
 	}
 
 	if (_oxygenTimer.isFuseLit()) {
diff --git a/engines/pegasus/items/inventorypicture.cpp b/engines/pegasus/items/inventorypicture.cpp
index fc812fa..99b9ad8 100644
--- a/engines/pegasus/items/inventorypicture.cpp
+++ b/engines/pegasus/items/inventorypicture.cpp
@@ -318,6 +318,10 @@ void InventoryItemsPicture::deactivateInventoryPicture() {
 	}
 }
 
+void InventoryItemsPicture::setCommPicture() {
+	_pictName = "Images/Items/Inventory/Comm Panel";
+}
+
 void InventoryItemsPicture::playEndMessage(DisplayElement *pushElement) {
 	PegasusEngine *vm = (PegasusEngine *)g_engine;
 
@@ -326,6 +330,7 @@ void InventoryItemsPicture::playEndMessage(DisplayElement *pushElement) {
 	_shouldDrawHighlight = false;
 	endMessage.shareSurface(this);
 	endMessage.initFromMovieFile("Images/Caldoria/A56 Congrats");
+	endMessage.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
 	endMessage.moveMovieBoxTo(kFinalMessageLeft - kInventoryPushLeft, kFinalMessageTop - kInventoryPushTop);
 	endMessage.setTriggeredElement(pushElement);
 	endMessage.start();
diff --git a/engines/pegasus/items/inventorypicture.h b/engines/pegasus/items/inventorypicture.h
index 9eba25b..1c89f50 100644
--- a/engines/pegasus/items/inventorypicture.h
+++ b/engines/pegasus/items/inventorypicture.h
@@ -98,6 +98,7 @@ public:
 
 	void disableLooping() { _isLooping = false; }
 
+	void setCommPicture();
 	void playEndMessage(DisplayElement *);
 
 protected:
diff --git a/engines/pegasus/items/item.h b/engines/pegasus/items/item.h
index a1451b2..1b0e7c0 100644
--- a/engines/pegasus/items/item.h
+++ b/engines/pegasus/items/item.h
@@ -118,6 +118,7 @@ static const ItemID kArgonPickup = 24;
 // Biochips.
 
 static const ItemID kAIBiochip = 0;
+static const ItemID kArthurBiochip = 1;
 static const ItemID kInterfaceBiochip = 1;
 static const ItemID kMapBiochip = 2;
 static const ItemID kOpticalBiochip = 3;
@@ -248,6 +249,14 @@ static const ItemState kFlashlightOn = 115;
 static const ItemState kNitrogenEmpty = 116;
 static const ItemState kNitrogenFull = 117;
 static const ItemState kFullGlass = 118;
+static const ItemState kArthur000 = 119;
+static const ItemState kArthur002 = 120;
+static const ItemState kArthur010 = 121;
+static const ItemState kArthur012 = 122;
+static const ItemState kArthur100 = 123;
+static const ItemState kArthur102 = 124;
+static const ItemState kArthur110 = 125;
+static const ItemState kArthur112 = 126;
 
 // Extra IDs.
 
diff --git a/engines/pegasus/menu.cpp b/engines/pegasus/menu.cpp
index e55c006..0897f2a 100644
--- a/engines/pegasus/menu.cpp
+++ b/engines/pegasus/menu.cpp
@@ -23,6 +23,8 @@
  *
  */
 
+#include "common/file.h"
+
 #include "pegasus/gamestate.h"
 #include "pegasus/menu.h"
 #include "pegasus/pegasus.h"
@@ -155,7 +157,10 @@ MainMenu::MainMenu() : GameMenu(kMainMenuID), _menuBackground(0), _overviewButto
 		else
 			_menuBackground.initFromPICTFile("Images/Demo/DemoMenu.pict");
 	} else {
-		_menuBackground.initFromPICTFile("Images/Main Menu/MainMenu.mac");
+		if (((PegasusEngine *)g_engine)->isDVD())
+			_menuBackground.initFromPICTFile("Images/Main Menu/MainMenu_hq.mac");
+		else
+			_menuBackground.initFromPICTFile("Images/Main Menu/MainMenu.mac");
 	}
 	_menuBackground.setDisplayOrder(0);
 	_menuBackground.startDisplaying();
@@ -444,9 +449,12 @@ static const CoordType kCreditsMainMenuSelectTop = 408;
 
 static const TimeValue kCoreTeamTime = 0;
 static const TimeValue kSupportTeamTime = 1920;
-static const TimeValue kOriginalTeamTime = 3000;
-static const TimeValue kTalentTime = 4440;
-static const TimeValue kOtherTitlesTime = 4680;
+static const TimeValue kOriginalTeamCDTime = 3000;
+static const TimeValue kOriginalTeamDVDTime = 3240;
+static const TimeValue kTalentCDTime = 4440;
+static const TimeValue kTalentDVDTime = 4680;
+static const TimeValue kOtherTitlesCDTime = 4680;
+static const TimeValue kOtherTitlesDVDTime = 4920;
 
 static const TimeValue kFrameIncrement = 120; // Three frames...
 
@@ -454,12 +462,18 @@ static const TimeValue kFrameIncrement = 120; // Three frames...
 CreditsMenu::CreditsMenu() : GameMenu(kCreditsMenuID), _menuBackground(0), _creditsMovie(0),
 		_mainMenuButton(0), _largeSelect(0), _smallSelect(0) {
 
-	_menuBackground.initFromPICTFile("Images/Credits/CredScrn.pict");
+	if (((PegasusEngine *)g_engine)->isDVD())
+		_menuBackground.initFromPICTFile("Images/Credits/CredScrnScummVM.pict");
+	else
+		_menuBackground.initFromPICTFile("Images/Credits/CredScrn.pict");
 	_menuBackground.setDisplayOrder(0);
 	_menuBackground.startDisplaying();
 	_menuBackground.show();
 
-	_creditsMovie.initFromMovieFile("Images/Credits/Credits.movie");
+	if (((PegasusEngine *)g_engine)->isDVD())
+		_creditsMovie.initFromMovieFile("Images/Credits/Credits_scummVM.movie");
+	else
+		_creditsMovie.initFromMovieFile("Images/Credits/Credits.movie");
 	_creditsMovie.setDisplayOrder(1);
 	_creditsMovie.moveElementTo(kCreditsMovieLeft, kCreditsMovieTop);
 	_creditsMovie.startDisplaying();
@@ -484,6 +498,37 @@ CreditsMenu::CreditsMenu() : GameMenu(kCreditsMenuID), _menuBackground(0), _cred
 	_menuSelection = -1;
 
 	newMenuSelection(kCreditsMenuCoreTeam);
+
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		_menuLoop.attachFader(&_menuFader);
+		_menuLoop.initFromAIFFFile("Sounds/Credits.aiff");
+	}
+}
+
+CreditsMenu::~CreditsMenu() {
+	if (_menuLoop.isPlaying())
+		stopCreditsMenuLoop();
+}
+
+void CreditsMenu::startCreditsMenuLoop() {
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		FaderMoveSpec spec;
+
+		_menuLoop.loopSound();
+		spec.makeTwoKnotFaderSpec(30, 0, 0, 30, 255);
+
+		_menuFader.startFader(spec);
+	}
+}
+
+void CreditsMenu::stopCreditsMenuLoop() {
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		FaderMoveSpec spec;
+	
+		spec.makeTwoKnotFaderSpec(30, 0, 255, 30, 0);
+		_menuFader.startFaderSync(spec);
+		_menuLoop.stopSound();
+	}
 }
 
 // Assumes the new selection is never more than one away from the old...
@@ -493,51 +538,59 @@ void CreditsMenu::newMenuSelection(const int newSelection) {
 		case kCreditsMenuCoreTeam:
 			_smallSelect.moveElementTo(kCoreTeamSelectLeft, kCoreTeamSelectTop);
 			_creditsMovie.setTime(kCoreTeamTime);
-			_creditsMovie.redrawMovieWorld();
 			break;
 		case kCreditsMenuSupportTeam:
 			_smallSelect.moveElementTo(kSupportTeamSelectLeft, kSupportTeamSelectTop);
 			_creditsMovie.setTime(kSupportTeamTime);
-			_creditsMovie.redrawMovieWorld();
 			break;
 		case kCreditsMenuOriginalTeam:
 			_smallSelect.moveElementTo(kOriginalTeamSelectLeft, kOriginalTeamSelectTop);
-			_creditsMovie.setTime(kOriginalTeamTime);
-			_creditsMovie.redrawMovieWorld();
+			if (((PegasusEngine *)g_engine)->isDVD())
+				_creditsMovie.setTime(kOriginalTeamDVDTime);
+			else
+				_creditsMovie.setTime(kOriginalTeamCDTime);
 			break;
 		case kCreditsMenuTalent:
 			_smallSelect.moveElementTo(kTalentSelectLeft, kTalentSelectTop);
-			_creditsMovie.setTime(kTalentTime);
-			_creditsMovie.redrawMovieWorld();
+			if (((PegasusEngine *)g_engine)->isDVD())
+				_creditsMovie.setTime(kTalentDVDTime);
+			else
+				_creditsMovie.setTime(kTalentCDTime);
 			break;
 		case kCreditsMenuOtherTitles:
 			_smallSelect.moveElementTo(kOtherTitlesSelectLeft, kOtherTitlesSelectTop);
 			_smallSelect.show();
 			_largeSelect.hide();
-			_creditsMovie.setTime(kOtherTitlesTime);
-			_creditsMovie.redrawMovieWorld();
+			if (((PegasusEngine *)g_engine)->isDVD())
+				_creditsMovie.setTime(kOtherTitlesDVDTime);
+			else
+				_creditsMovie.setTime(kOtherTitlesCDTime);
 			break;
 		case kCreditsMenuMainMenu:
 			_smallSelect.hide();
 			_largeSelect.show();
 			break;
 		}
+		_creditsMovie.redrawMovieWorld();
 
 		_menuSelection = newSelection;
 	}
 }
 
 void CreditsMenu::newMovieTime(const TimeValue newTime) {
+	// The DVD credits have an extra frame in the support team section
+	bool isDVD = ((PegasusEngine *)g_engine)->isDVD();
+
 	if (newTime < kSupportTeamTime) {
 		_smallSelect.moveElementTo(kCoreTeamSelectLeft, kCoreTeamSelectTop);
 		_menuSelection = kCreditsMenuCoreTeam;
-	} else if (newTime < kOriginalTeamTime) {
+	} else if ((isDVD && newTime < kOriginalTeamDVDTime) || (!isDVD && newTime < kOriginalTeamCDTime)) {
 		_smallSelect.moveElementTo(kSupportTeamSelectLeft, kSupportTeamSelectTop);
 		_menuSelection = kCreditsMenuSupportTeam;
-	} else if (newTime < kTalentTime) {
+	} else if ((isDVD && newTime < kTalentDVDTime) || (!isDVD && newTime < kTalentCDTime)) {
 		_smallSelect.moveElementTo(kOriginalTeamSelectLeft, kOriginalTeamSelectTop);
 		_menuSelection = kCreditsMenuOriginalTeam;
-	} else if (newTime < kOtherTitlesTime) {
+	} else if ((isDVD && newTime < kOtherTitlesDVDTime) || (!isDVD && newTime < kOtherTitlesCDTime)) {
 		_smallSelect.moveElementTo(kTalentSelectLeft, kTalentSelectTop);
 		_smallSelect.show();
 		_largeSelect.hide();
@@ -664,10 +717,11 @@ DeathMenu::DeathMenu(const DeathReason deathReason) : GameMenu(kDeathMenuID), _d
 			"dAunmade", "dAbombed", "dAshot", "dAassass", "dAnuked",
 			"dTunmade", "dTshot", "dPfall", "dPdino", "dPstuck",
 			"dNchoke", "dNcaught", "dNcaught", "dNsub", "dNrobot1",
-			"dNrobot2", "dMfall", "dMcaught", "dMtracks", "dMrobot",
-			"dMtoast", "dMexplo1", "dMexplo2", "dMchoke1", "dMchoke2",
-			"dMdroid", "dMfall", "dMgears", "dMshutt1", "dMshutt2",
-			"dWpoison", "dWcaught", "dWplasma", "dWshot", "dAfinale"
+			"dNrobot2", "dMfall", "dMcaught", "dMcollision", "dMtracks",
+			"dMrobot", "dMtoast", "dMexplo1", "dMexplo2", "dMchoke1",
+			"dMchoke2", "dMdroid", "dMshaft", "dMgears", "dMshutt1",
+			"dMshutt2", "dWpoison", "dWcaught", "dWplasma", "dWshot",
+			"dAfinale"
 		};
 
 		imageName += fileNames[deathReason - 1];
@@ -735,7 +789,10 @@ DeathMenu::DeathMenu(const DeathReason deathReason) : GameMenu(kDeathMenuID), _d
 		_largeSelect.setDisplayOrder(2);
 		_largeSelect.startDisplaying();
 	} else {
-		_triumphSound.initFromQuickTime("Sounds/Caldoria/Galactic Triumph");
+		if (vm->isDVD()) // Updated file for the DVD version
+			_triumphSound.initFromAIFFFile("Sounds/Caldoria/Galactic Triumph.44K.aiff");
+		else
+			_triumphSound.initFromQuickTime("Sounds/Caldoria/Galactic Triumph");
 		_triumphSound.playSound();
 	}
 
@@ -864,6 +921,7 @@ void DeathMenu::drawAllScores() {
 	case kDeathRobotSubControlRoom:
 	case kDeathWrongShuttleLock:
 	case kDeathArrestedInMars:
+	case kDeathCollidedWithPod:
 	case kDeathRunOverByPod:
 	case kDeathDidntGetOutOfWay:
 	case kDeathReactorBurn:
diff --git a/engines/pegasus/menu.h b/engines/pegasus/menu.h
index 288b846..c0a27ef 100644
--- a/engines/pegasus/menu.h
+++ b/engines/pegasus/menu.h
@@ -97,9 +97,11 @@ protected:
 class CreditsMenu : public GameMenu {
 public:
 	CreditsMenu();
-	virtual ~CreditsMenu() {}
+	virtual ~CreditsMenu();
 
 	virtual void handleInput(const Input &input, const Hotspot *);
+	void startCreditsMenuLoop();
+	void stopCreditsMenuLoop();
 
 protected:
 	void newMenuSelection(const int);
@@ -111,6 +113,9 @@ protected:
 	Picture _mainMenuButton;
 	Picture _largeSelect;
 	Picture _smallSelect;
+
+	Sound _menuLoop;
+	SoundFader _menuFader;
 };
 
 class DeathMenu : public GameMenu {
diff --git a/engines/pegasus/module.mk b/engines/pegasus/module.mk
index cb44a04..2dd5b87 100644
--- a/engines/pegasus/module.mk
+++ b/engines/pegasus/module.mk
@@ -1,6 +1,7 @@
 MODULE := engines/pegasus
 
 MODULE_OBJS = \
+	chase.o \
 	compass.o \
 	console.o \
 	cursor.o \
@@ -33,6 +34,7 @@ MODULE_OBJS = \
 	items/itemdragger.o \
 	items/itemlist.o \
 	items/biochips/aichip.o \
+	items/biochips/arthurchip.o \
 	items/biochips/biochipitem.o \
 	items/biochips/mapchip.o \
 	items/biochips/mapimage.o \
@@ -58,6 +60,7 @@ MODULE_OBJS = \
 	neighborhood/caldoria/caldoriabomb.o \
 	neighborhood/caldoria/caldoriamessages.o \
 	neighborhood/caldoria/caldoriamirror.o \
+	neighborhood/mars/canyonchase.o \
 	neighborhood/mars/energybeam.o \
 	neighborhood/mars/gravitoncannon.o \
 	neighborhood/mars/hermite.o \
@@ -71,6 +74,7 @@ MODULE_OBJS = \
 	neighborhood/mars/spacechase3d.o \
 	neighborhood/mars/spacejunk.o \
 	neighborhood/mars/tractorbeam.o \
+	neighborhood/mars/tunnelpod.o \
 	neighborhood/norad/norad.o \
 	neighborhood/norad/noradelevator.o \
 	neighborhood/norad/pressuredoor.o \
@@ -82,6 +86,7 @@ MODULE_OBJS = \
 	neighborhood/norad/alpha/noradalpha.o \
 	neighborhood/norad/alpha/panorama.o \
 	neighborhood/norad/alpha/panoramascroll.o \
+	neighborhood/norad/alpha/subchase.o \
 	neighborhood/norad/delta/globegame.o \
 	neighborhood/norad/delta/noraddelta.o \
 	neighborhood/prehistoric/prehistoric.o \
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.cpp b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
index 0707a83..0cb7f22 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
@@ -25,6 +25,7 @@
 
 #include "common/system.h"
 #include "video/qt_decoder.h"
+#include "video/theora_decoder.h"
 
 #include "pegasus/cursor.h"
 #include "pegasus/energymonitor.h"
@@ -32,6 +33,7 @@
 #include "pegasus/interface.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/biochipitem.h"
 #include "pegasus/neighborhood/caldoria/caldoria.h"
 #include "pegasus/neighborhood/caldoria/caldoria4dsystem.h"
@@ -48,6 +50,15 @@ static const int16 kDrawersAngle = -30;
 static const int16 kCaldoria53Angle = 45;
 static const int16 kCaldoria55Angle = -45;
 
+static const ExtraID kCreateCornbread = 1000;
+static const ExtraID kWashingMachineZoomIn = 1001;
+static const ExtraID kWashingMachineLoop = 1002;
+static const ExtraID kWashingMachineZoomOut = 1003;
+
+static const HotSpotID kCaldoriaLaundryZoomInHotSpotID = 10000;
+static const HotSpotID kCaldoriaLaundryZoomOutHotSpotID = 10001;
+static const HotSpotID kCaldoriaCornbreadHotSpotID = 10002;
+
 static const TimeValue kSinclairInterruptionTime1 = 2955;
 static const TimeValue kSinclairInterruptionTime2 = 6835;
 static const TimeValue kSinclairInterruptionTime3 = 9835;
@@ -56,6 +67,12 @@ static const TimeValue kSinclairInterruptionTime4 = 12555;
 static const InputBits kPullbackInterruptFilter = kFilterAllInput;
 static const InputBits kRecalibrationInterruptFilter = kFilterAllInput;
 
+static const TimeValue kCaldoriaLaundryIntro1In = 0;
+static const TimeValue kCaldoriaLaundryIntro1Out = 2645;
+
+static const TimeValue kCaldoriaLaundryIntro2In = 2645;
+static const TimeValue kCaldoriaLaundryIntro2Out = 4933;
+
 static const TimeValue kCaldoriaReplicatorIntroIn = 4933;
 static const TimeValue kCaldoriaReplicatorIntroOut = 6557;
 
@@ -92,9 +109,6 @@ static const TimeValue kCaldoriaNobodyHomeOut = 21469;
 static const TimeValue kCaldoriaNoOtherFloorIn = 21469;
 static const TimeValue kCaldoriaNoOtherFloorOut = 28013;
 
-static const TimeValue kCaldoria4DInstructionsIn = 28013;
-static const TimeValue kCaldoria4DInstructionsOut = 29730;
-
 static const TimeValue kCaldoriaDrinkOJIn = 33910;
 static const TimeValue kCaldoriaDrinkOJOut = 35846;
 
@@ -159,7 +173,9 @@ void SinclairCallBack::callBack() {
 }
 
 Caldoria::Caldoria(InputHandler* nextHandler, PegasusEngine *owner)
-		: Neighborhood(nextHandler, owner, "Caldoria", kCaldoriaID), _sinclairInterrupt(this) {
+		: Neighborhood(nextHandler, owner, "Caldoria", kCaldoriaID), _extraMovie(kNoDisplayElement),
+		_laundryZoomInSpot(kCaldoriaLaundryZoomInHotSpotID), _laundryZoomOutSpot(kCaldoriaLaundryZoomOutHotSpotID),
+		_cornbreadSpot(kCaldoriaCornbreadHotSpotID), _sinclairInterrupt(this), _lookingAtLaundry(false) {
 	setIsItemTaken(kKeyCard);
 	setIsItemTaken(kOrangeJuiceGlassEmpty);
 	GameState.setTakenItemID(kOrangeJuiceGlassFull, GameState.isTakenItemID(kOrangeJuiceGlassEmpty));
@@ -169,14 +185,35 @@ Caldoria::Caldoria(InputHandler* nextHandler, PegasusEngine *owner)
 
 Caldoria::~Caldoria() {
 	_sinclairInterrupt.releaseCallBack();
+	if (_vm->isDVD()) {
+		_vm->getAllHotspots().remove(&_laundryZoomInSpot);
+		_vm->getAllHotspots().remove(&_laundryZoomOutSpot);
+		_vm->getAllHotspots().remove(&_cornbreadSpot);
+	}
 }
 
 void Caldoria::init() {
 	Neighborhood::init();
 
+	if (_vm->isDVD()) {
+		_laundryZoomInSpot.setArea(Common::Rect(384, 120, 576, 320));
+		_laundryZoomInSpot.setHotspotFlags(kNeighborhoodSpotFlag | kZoomInSpotFlag);
+		_vm->getAllHotspots().push_back(&_laundryZoomInSpot);
+
+		_laundryZoomOutSpot.setArea(Common::Rect(64, 64, 576, 320));
+		_laundryZoomOutSpot.setHotspotFlags(kNeighborhoodSpotFlag | kZoomOutSpotFlag);
+		_vm->getAllHotspots().push_back(&_laundryZoomOutSpot);
+
+		_cornbreadSpot.setArea(Common::Rect(270, 233, 381, 298));
+		_cornbreadSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag);
+		_vm->getAllHotspots().push_back(&_cornbreadSpot);
+	}
+
 	// We need this notification flag as well.
 	_neighborhoodNotification.notifyMe(this, kSinclairLoopDoneFlag, kSinclairLoopDoneFlag);
 
+	_extraMovieCallBack.setNotification(&_neighborhoodNotification);
+
 	_sinclairInterrupt.initCallBack(&_navMovie, kCallBackAtTime);
 
 	forceStridingStop(kCaldoria55, kSouth, kAltCaldoriaSinclairDown);
@@ -187,27 +224,59 @@ void Caldoria::start() {
 	g_energyMonitor->stopEnergyDraining();
 
 	if (!GameState.getCaldoriaSeenPullback()) {
+		Input input;
+		Common::String wakeModeMoviePath;
+		InputDevice.getInput(input, kPullbackInterruptFilter);
+		if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) {
+			wakeModeMoviePath = "Images/Caldoria/A00WM";
+		} else {
+			wakeModeMoviePath = "Images/Caldoria/A00WN";
+		}
+
 		_vm->_gfx->doFadeOutSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond);
 
-		g_system->delayMillis(2 * 1000);
+		Video::VideoDecoder *pullbackMovie = 0;
+		uint16 pullbackX, pullbackY;
 
-		Video::VideoDecoder *pullbackMovie = new Video::QuickTimeDecoder();
+#ifdef USE_THEORADEC
+		if (_vm->isDVD()) {
+			// Updated larger version
+			pullbackMovie = new Video::TheoraDecoder();
+
+			if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.ogg")) {
+				delete pullbackMovie;
+				pullbackMovie = 0;
+			}
+		}
+#endif
+		
+		if (!pullbackMovie) {
+			pullbackMovie = new Video::QuickTimeDecoder();
 
-		if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.movie"))
-			error("Could not load pullback movie");
+			if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.movie"))
+				error("Could not load Pullback.movie");
+		}
+		
+		if (_vm->isDVD()) {
+			uint16 newHeight = (uint16)((640.0f / (float)pullbackMovie->getWidth()) * (float)pullbackMovie->getHeight());
+			pullbackX = 0;
+			pullbackY = (480 - newHeight) / 2;
+		} else {
+			pullbackX = 80;
+			pullbackY = 112;
+		}
 
 		// Draw the first frame so we can fade to it
 		const Graphics::Surface *frame = pullbackMovie->decodeNextFrame();
 		assert(frame);
 		assert(frame->format == g_system->getScreenFormat());
-		g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 64, 112, frame->w, frame->h);
+		g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, pullbackX, pullbackY, frame->w, frame->h);
 		_vm->_gfx->doFadeInSync(kTwoSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond);
 
 		bool saveAllowed = _vm->swapSaveAllowed(false);
 		bool openAllowed = _vm->swapLoadAllowed(false);
 
 		bool skipped = false;
-		Input input;
 
 		pullbackMovie->start();
 
@@ -216,13 +285,13 @@ void Caldoria::start() {
 				frame = pullbackMovie->decodeNextFrame();
 
 				if (frame) {
-					g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 64, 112, frame->w, frame->h);
+					g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, pullbackX, pullbackY, frame->w, frame->h);
 					g_system->updateScreen();
 				}
 			}
 
 			InputDevice.getInput(input, kPullbackInterruptFilter);
-			if (input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) {
+			if ((input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) && !GameState.getEasterEgg()) {
 				skipped = true;
 				break;
 			}
@@ -241,14 +310,56 @@ void Caldoria::start() {
 		ExtraTable::Entry entry;
 
 		if (!skipped) {
-			_vm->_gfx->doFadeOutSync(kThreeSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false);
-			g_system->delayMillis(3 * 1000 / 2);
-			getExtraEntry(kCaldoria00WakeUp1, entry);
-			_navMovie.setTime(entry.movieStart);
-			_navMovie.redrawMovieWorld();
-			_navMovie.show();
-			_vm->refreshDisplay();
-			_vm->_gfx->doFadeInSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false);
+			if (_vm->isDVD()) {
+				Video::VideoDecoder* wakeModeMovie = 0;
+#ifdef USE_THEORADEC
+				wakeModeMovie = new Video::TheoraDecoder();
+				if (!wakeModeMovie->loadFile(wakeModeMoviePath + ".ogg")) {
+					delete wakeModeMovie;
+					wakeModeMovie = 0;
+				}
+#endif
+				if (!wakeModeMovie) {
+					wakeModeMovie = new Video::QuickTimeDecoder();
+					if (!wakeModeMovie->loadFile(wakeModeMoviePath + ".movie"))
+						error("Could not load Jonny Ego movie");
+				}
+
+				wakeModeMovie->start();
+
+				while (!_vm->shouldQuit() && !wakeModeMovie->endOfVideo()) {
+					if (wakeModeMovie->needsUpdate()) {
+						frame = wakeModeMovie->decodeNextFrame();
+
+						if (frame) {
+							g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h);
+							g_system->updateScreen();
+						}
+					}
+
+					InputDevice.getInput(input, kPullbackInterruptFilter);
+					if ((input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) && !GameState.getEasterEgg()) {
+						skipped = true;
+						break;
+					}
+
+					g_system->delayMillis(10);
+				}
+
+				delete wakeModeMovie;
+
+				if (_vm->shouldQuit())
+					return;
+			} else {
+				_vm->_gfx->doFadeOutSync(kThreeSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false);
+				g_system->delayMillis(3 * 1000 / 2);
+				getExtraEntry(kCaldoria00WakeUp1, entry);
+				_navMovie.setTime(entry.movieStart);
+				_navMovie.redrawMovieWorld();
+				_navMovie.show();
+				_vm->refreshDisplay();
+				_vm->_gfx->doFadeInSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false);
+			}
 		} else {
 			getExtraEntry(kCaldoria00WakeUp1, entry);
 			_navMovie.setTime(entry.movieStart);
@@ -262,6 +373,15 @@ void Caldoria::start() {
 	Neighborhood::start();
 }
 
+void Caldoria::throwAwayInterface() {
+	Neighborhood::throwAwayInterface();
+	if (_vm->isDVD()) {
+		_vm->getAllHotspots().remove(&_laundryZoomInSpot);
+		_vm->getAllHotspots().remove(&_laundryZoomOutSpot);
+		_vm->getAllHotspots().remove(&_cornbreadSpot);
+	}
+}
+
 void Caldoria::flushGameState() {
 	GameState.setCaldoriaFuseTimeLimit(_utilityFuse.getTimeRemaining());
 }
@@ -686,18 +806,34 @@ void Caldoria::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec
 void Caldoria::loadAmbientLoops() {
 	RoomID room = GameState.getCurrentRoom();
 
-	if (room == kCaldoria00 && GameState.getCaldoriaWokenUp())
-		loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4);
-	else if (room >= kCaldoria01 && room <= kCaldoria14)
-		loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4);
-	else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45)
-		loadLoopSound1("Sounds/Caldoria/Elevator Loop.AIFF", 0x100 / 5);
-	else if (room == kCaldoria44)
-		loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.AIFF");
-	else if (room >= kCaldoria15 && room <= kCaldoria48)
-		loadLoopSound1("Sounds/Caldoria/Industrial Nuage.aiff", 2 * 0x100 / 3);
-	else if (room >= kCaldoria49 && room <= kCaldoria56)
-		loadLoopSound1("Sounds/Caldoria/A50NLB00.22K.AIFF", 0x100 / 4);
+	if (_vm->isDVD()) {
+		// Updated sounds in the DVD version
+		if (room == kCaldoria00 && GameState.getCaldoriaWokenUp())
+			loadLoopSound1("Sounds/Caldoria/Apartment Music.32K.aiff", 0x100 / 4);
+		else if (room >= kCaldoria01 && room <= kCaldoria14)
+			loadLoopSound1("Sounds/Caldoria/Apartment Music.32K.aiff", 0x100 / 4);
+		else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45)
+			loadLoopSound1("Sounds/Caldoria/Elevator Loop.32K.aiff", 0x100 / 5);
+		else if (room == kCaldoria44)
+			loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.44K.aiff");
+		else if (room >= kCaldoria15 && room <= kCaldoria48)
+			loadLoopSound1("Sounds/Caldoria/Industrial Nuage.44K.aiff", 2 * 0x100 / 3);
+		else if (room >= kCaldoria49 && room <= kCaldoria56)
+			loadLoopSound1("Sounds/Caldoria/A50NLB00.32K.AIFF", 0x100 / 4);
+	} else {
+		if (room == kCaldoria00 && GameState.getCaldoriaWokenUp())
+			loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4);
+		else if (room >= kCaldoria01 && room <= kCaldoria14)
+			loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4);
+		else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45)
+			loadLoopSound1("Sounds/Caldoria/Elevator Loop.AIFF", 0x100 / 5);
+		else if (room == kCaldoria44)
+			loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.AIFF");
+		else if (room >= kCaldoria15 && room <= kCaldoria48)
+			loadLoopSound1("Sounds/Caldoria/Industrial Nuage.aiff", 2 * 0x100 / 3);
+		else if (room >= kCaldoria49 && room <= kCaldoria56)
+			loadLoopSound1("Sounds/Caldoria/A50NLB00.22K.AIFF", 0x100 / 4);
+	}
 }
 
 void Caldoria::checkContinuePoint(const RoomID room, const DirectionConstant direction) {
@@ -718,8 +854,15 @@ void Caldoria::checkContinuePoint(const RoomID room, const DirectionConstant dir
 
 void Caldoria::spotCompleted() {
 	Neighborhood::spotCompleted();
-	if (GameState.getCurrentRoom() == kCaldoriaBinoculars)
+	switch (GameState.getCurrentRoom()) {
+	case kCaldoriaBinoculars:
 		startExtraSequence(kBinocularsZoomInOnShip, kExtraCompletedFlag, kFilterNoInput);
+		break;
+	case kCaldoriaToilet:
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA47", kArthurCaldoriaReadPaper);
+		break;
+	}
 }
 
 void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) {
@@ -741,6 +884,7 @@ void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) {
 
 	Neighborhood::arriveAt(room, direction);
 	Input dummy;
+	Sound flushSound;
 
 	switch (room) {
 	case kCaldoria00:
@@ -757,6 +901,27 @@ void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) {
 	case kCaldoria09:
 		_lastExtra = 0xffffffff;
 		break;
+	case kCaldoria10:
+		if (_vm->isDVD() && direction == kWest) {
+			_vm->_cursor->hide();
+			flushSound.initFromAIFFFile("Sounds/Caldoria/Apartment Toilet.32K.aiff");
+			flushSound.setVolume(_vm->getSoundFXLevel());
+			flushSound.playSound();
+			while (flushSound.isPlaying() && !_vm->shouldQuit()) {
+				InputDevice.getInput(dummy, kFilterNoInput);
+
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				_vm->_system->delayMillis(10);
+			}
+			if (_vm->shouldQuit())
+				return;
+			_vm->_cursor->hideUntilMoved();
+		} else if (direction == kEast) {
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA42", kArthurCaldoriaReachedToilet);
+		}
+		break;
 	case kCaldoriaToilet:
 		GameState.setScoringReadPaper(true);
 		break;
@@ -812,6 +977,10 @@ void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) {
 	case kCaldoria49:
 		arriveAtCaldoria49();
 		break;
+	case kCaldoria48:
+		if (direction == kNorth && !GameState.getCaldoriaDoorBombed() && GameState.isTakenItemID(kCardBomb) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurCaldoriaRoofDoor);		
+		break;
 	case kCaldoria53:
 		if (direction == kEast && !GameState.getCaldoriaSinclairShot())
 			zoomToSinclair();
@@ -839,30 +1008,79 @@ void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) {
 void Caldoria::doAIRecalibration() {
 	GameState.setCaldoriaDidRecalibration(true);
 
-	if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB1", true, kRecalibrationInterruptFilter))
-		return;
+	Input input;
+	InputDevice.getInput(input, kPullbackInterruptFilter);
+	if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) {
+		Video::VideoDecoder *video = 0;
 
-	g_interface->calibrateEnergyBar();
-	if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB4", true, kRecalibrationInterruptFilter))
-		return;
+		_vm->_cursor->hide();
+
+#ifdef USE_THEORADEC
+		video = new Video::TheoraDecoder();
+		if (!video->loadFile("Images/Caldoria/A00EA.ogg")) {
+			delete video;
+			video = 0;
+		}
+#endif
+
+		if (!video) {
+			video = new Video::QuickTimeDecoder();
+			if (!video->loadFile("Images/Caldoria/A00EA.movie"))
+				error("Could not load Month-O-Matic video");
+		}
+
+		video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF));
+		video->start();
+
+		while (!_vm->shouldQuit() && !video->endOfVideo()) {
+			if (video->needsUpdate()) {
+				const Graphics::Surface *frame = video->decodeNextFrame();
+
+				if (frame) {
+					g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, kNavAreaLeft, kNavAreaTop, frame->w, frame->h);
+					g_system->updateScreen();
+				}
+			}
+
+			Common::Event event;
+			while (g_system->getEventManager()->pollEvent(event))
+				;
+
+			g_system->delayMillis(10);
+		}
+
+		delete video;
+
+		if (_vm->shouldQuit())
+			return;
+		
+		arriveAt(kCaldoria01, kEast);
+	} else if (g_AIArea->isChattyAI()) {
+		if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB1", true, kRecalibrationInterruptFilter))
+			return;
+
+		g_interface->calibrateEnergyBar();
+		if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB4", true, kRecalibrationInterruptFilter))
+			return;
+
+		g_interface->raiseInventoryDrawerSync();
+		if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB6", true, kRecalibrationInterruptFilter)) {
+			g_interface->lowerInventoryDrawerSync();
+			return;
+		}
 
-	g_interface->raiseInventoryDrawerSync();
-	if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB6", true, kRecalibrationInterruptFilter)) {
 		g_interface->lowerInventoryDrawerSync();
-		return;
-	}
+		g_interface->raiseBiochipDrawerSync();
 
-	g_interface->lowerInventoryDrawerSync();
-	g_interface->raiseBiochipDrawerSync();
+		if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB5", true, kRecalibrationInterruptFilter)) {
+			g_interface->lowerBiochipDrawerSync();
+			return;
+		}
 
-	if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB5", true, kRecalibrationInterruptFilter)) {
 		g_interface->lowerBiochipDrawerSync();
-		return;
-	}
-
-	g_interface->lowerBiochipDrawerSync();
 
-	g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB8", false, kRecalibrationInterruptFilter);
+		g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB8", false, kRecalibrationInterruptFilter);
+	}
 }
 
 void Caldoria::arriveAtCaldoria00() {
@@ -985,12 +1203,26 @@ void Caldoria::setUpRoofTop() {
 	}
 }
 
+void Caldoria::leftButton(const Input &input) {
+	if (!(GameState.getCurrentRoomAndView() == MakeRoomView(kCaldoria11, kWest) && _lookingAtLaundry))
+		Neighborhood::leftButton(input);
+}
+
+void Caldoria::rightButton(const Input &input) {
+	if (!(GameState.getCurrentRoomAndView() == MakeRoomView(kCaldoria11, kWest) && _lookingAtLaundry))
+		Neighborhood::rightButton(input);
+}
+
 void Caldoria::downButton(const Input &input) {
 	switch (GameState.getCurrentRoomAndView()) {
 	case MakeRoomView(kCaldoria01, kEast):
 		GameState.setCaldoriaWokenUp(true);
 		startExtraSequence(kCaldoria00SitDown, kExtraCompletedFlag, kFilterNoInput);
 		break;
+	case MakeRoomView(kCaldoria11, kWest):
+		if (_lookingAtLaundry)
+			startExtraSequence(kWashingMachineZoomOut, kExtraCompletedFlag, kFilterNoInput);
+		break;
 	default:
 		Neighborhood::downButton(input);
 		break;
@@ -1026,6 +1258,10 @@ void Caldoria::turnTo(const DirectionConstant direction) {
 	case kCaldoria09:
 		_lastExtra = 0xffffffff;
 		break;
+	case kCaldoria10:
+		if (direction == kEast && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA42", kArthurCaldoriaReachedToilet);
+		break;
 	case kCaldoria11:
 		if (direction == kEast && !GameState.getCaldoriaSeenMessages())
 			loopCroppedMovie("Images/Caldoria/A11 Message Machine Loop", kCaldoria11MessageLoopLeft, kCaldoria11MessageLoopTop);
@@ -1051,8 +1287,11 @@ void Caldoria::turnTo(const DirectionConstant direction) {
 			closeCroppedMovie();
 		break;
 	case kCaldoria48:
-		if (direction == kNorth && !GameState.getCaldoriaDoorBombed())
+		if (direction == kNorth && !GameState.getCaldoriaDoorBombed()) {
 			setCurrentActivation(kActivateRoofSlotEmpty);
+			if (GameState.isTakenItemID(kCardBomb) && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurCaldoriaRoofDoor);
+		}
 		break;
 	case kCaldoria53:
 		if (GameState.getCurrentDirection() == kEast && !GameState.getCaldoriaSinclairShot())
@@ -1085,7 +1324,10 @@ void Caldoria::zoomTo(const Hotspot *zoomOutSpot) {
 	// that doesn't involve the ClickInHotSpot function.
 	_zoomOutSpot = zoomOutSpot;
 
-	if (zoomOutSpot->getObjectID() == kCaldoriaDrawersOutSpotID) {
+	if (_vm->isDVD() && zoomOutSpot->getObjectID() == kCaldoriaReplicatorOutSpotID) {
+		GameState.setEasterEgg(false);
+		Neighborhood::zoomTo(zoomOutSpot);
+	} else if (zoomOutSpot->getObjectID() == kCaldoriaDrawersOutSpotID) {
 		if (_privateFlags.getFlag(kCaloriaPrivateLeftDrawerOpenFlag)) {
 			_privateFlags.setFlag(kCaloriaPrivateLeftDrawerOpenFlag, false);
 			startExtraSequence(kLeftDrawerClose, kExtraCompletedFlag, kFilterNoInput);
@@ -1122,6 +1364,100 @@ void Caldoria::zoomToSinclair() {
 	startExtraSequence(kCa53EastZoomToSinclair, kExtraCompletedFlag, kFilterAllInput);
 }
 
+void Caldoria::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
+	short left = kNavAreaLeft, top = kNavAreaTop;
+	DisplayOrder displayOrder = kNavMovieOrder + 1;
+	TimeValue segmentStart = 0, segmentStop = 0;
+	bool loopSequence = false;
+	Common::Rect pushBounds;
+	NotificationFlags extraFlags;
+
+	switch (extraID) {
+	case kCreateCornbread:
+	case kWashingMachineZoomIn:
+	case kWashingMachineLoop:
+	case kWashingMachineZoomOut:
+		_turnPush.getBounds(pushBounds);
+		
+		switch (extraID) {
+		case kCreateCornbread:
+			_extraMovie.initFromMovieFile("Images/Caldoria/A12RC.movie");
+			left = pushBounds.left;
+			top = pushBounds.top;
+			displayOrder = kNavMovieOrder + 1;
+			segmentStart = 0;
+			segmentStop = _extraMovie.getDuration();
+			loopSequence = false;
+			break;
+		case kWashingMachineZoomIn:
+			_extraMovie.initFromMovieFile("Images/Caldoria/A11WAS.movie");
+			left = pushBounds.left;
+			top = pushBounds.top;
+			displayOrder = kNavMovieOrder + 1;
+			segmentStart = 0;
+			segmentStop = 5480;
+			loopSequence = false;
+			break;
+		case kWashingMachineLoop:
+			// The washing machine movie will already be loaded after zooming in
+			left = pushBounds.left;
+			top = pushBounds.top;
+			displayOrder = kNavMovieOrder + 1;
+			segmentStart = 5480;
+			segmentStop = 9880;
+			loopSequence = true;
+			break;
+		case kWashingMachineZoomOut:
+			// The washing machine movie will still be loaded after looping
+			left = pushBounds.left;
+			top = pushBounds.top;
+			displayOrder = kNavMovieOrder + 1;
+			segmentStart = 9880;
+			segmentStop = 11200;
+			loopSequence = false;
+			break;
+		default:
+			break;
+		}
+		
+		_lastExtra = extraID;
+		_turnPush.hide();
+		
+		if (!loopSequence && g_AIArea)
+			g_AIArea->lockAIOut();
+		
+		extraFlags = flags;
+		_interruptionFilter = interruptionFilter;
+		// Stop the nav movie before doing anything else
+		_navMovie.stop();
+		_navMovie.stopDisplaying();
+		
+		_extraMovie.setVolume(_vm->getSoundFXLevel());
+		_extraMovie.moveElementTo(left, top);
+		_extraMovie.setDisplayOrder(displayOrder);
+		_extraMovie.startDisplaying();
+		_extraMovie.show();
+		_extraMovie.setFlags(0);
+		_extraMovie.setSegment(segmentStart, segmentStop);
+		_extraMovie.setTime(segmentStart);
+		if (loopSequence)
+			_extraMovie.setFlags(kLoopTimeBase);
+		else
+			extraFlags |= kNeighborhoodMovieCompletedFlag;
+		_extraMovieCallBack.cancelCallBack();
+		_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
+		if (extraFlags != 0) {
+			_extraMovieCallBack.setCallBackFlag(extraFlags);
+			_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		}
+		_extraMovie.start();
+		break;
+	default:
+		Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+		break;
+	}
+}
+
 void Caldoria::receiveNotification(Notification *notification, const NotificationFlags flags) {
 	Neighborhood::receiveNotification(notification, flags);
 
@@ -1158,8 +1494,31 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 			}
 			break;
 		case kCreateOrangeJuice:
+			GameState.setCaldoriaMadeOJ(true);
 			setCurrentActivation(kActivateOJOnThePad);
-			requestSpotSound(kCaldoriaReplicatorOJChoiceIn, kCaldoriaReplicatorOJChoiceOut, kFilterNoInput, 0);
+			GameState.setEasterEgg(false);
+			break;
+		case kCreateCornbread:
+			_extraMovie.moveElementTo(0, 0);
+			_vm->_gfx->setCurSurface(_navMovie.getSurface());
+			_extraMovie.copyToCurrentPort();
+			_vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea());
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			GameState.setEasterEgg(true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB39", kArthurCaldoriaCreatedCornbread);
+			break;
+		case kWashingMachineZoomIn:
+			_lookingAtLaundry = true;
+			startExtraSequence(kWashingMachineLoop, kExtraCompletedFlag, kFilterAllInput);
+			break;
+		case kWashingMachineZoomOut:
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			_lookingAtLaundry = false;
 			break;
 		case kCaldoria00SitDown:
 			arriveAt(kCaldoria00, kEast);
@@ -1202,15 +1561,27 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 		case kCa48NorthExplosion:
 			// Current biochip must be the shield if we got here.
 			_vm->getCurrentBiochip()->setItemState(kShieldNormal);
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA41", kArthurCaldoriaBlownDoor);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB42", kArthurCaldoriaBlownDoor);
+			}								
 			break;
 		case kBinocularsZoomInOnShip:
 			setCurrentActivation(kActivateFocusedOnShip);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA03", kArthurCaldoriaLookThroughTelescope);
 			break;
 		case kCa49NorthVoiceAnalysis:
 			_utilityFuse.primeFuse(kSinclairShootsTimeLimit);
 			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired));
 			_utilityFuse.lightFuse();
 			GameState.setCaldoriaSawVoiceAnalysis(true);
+			if (_vm->isDVD() && g_AIArea)
+				g_AIArea->checkRules();
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurCaldoriaSawVoiceAnalysis);
 			break;
 		case kCa53EastZoomToSinclair:
 			if (GameState.getCaldoriaSinclairShot()) {
@@ -1234,6 +1605,10 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 		}
 	} else if ((flags & kSpotSoundCompletedFlag) != 0) {
 		switch (GameState.getCurrentRoom()) {
+		case kCaldoria11:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA46", kArthurCaldoriaZoomedToLaundry);
+			break;
 		case kCaldoria20:
 		case kCaldoria21:
 		case kCaldoria26:
@@ -1241,6 +1616,8 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 		case kCaldoria34:
 		case kCaldoria35:
 			updateViewFrame();
+			if ((GameState.getCurrentRoom() == kCaldoria34 || GameState.getCurrentRoom() == kCaldoria35) && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA44", kArthurCaldoriaSawVacantApartment);
 			break;
 		case kCaldoria27:
 		case kCaldoria28:
@@ -1248,7 +1625,14 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 			updateElevatorMovie();
 			break;
 		case kCaldoriaReplicator:
-			emptyOJGlass();
+			if (_spotSounds.getStart() == kCaldoriaReplicatorWrongChoiceIn) {
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA16", kArthurCaldoriaSelectedStickyBuns);
+			} else {
+				emptyOJGlass();
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA45", kArthurCaldoriaDrankOJ);
+			}
 			break;
 		}
 	} else if ((flags & kSinclairLoopDoneFlag) != 0) {
@@ -1313,6 +1697,16 @@ void Caldoria::activateHotspots() {
 	case kCaldoriaReplicator:
 		if (GameState.getCaldoriaMadeOJ())
 			_vm->getAllHotspots().deactivateOneHotspot(kCaldoriaMakeOJSpotID);
+		if (GameState.getEasterEgg())
+			_vm->getAllHotspots().activateOneHotspot(kCaldoriaCornbreadHotSpotID);
+		break;
+	case kCaldoria11:
+		if (_vm->isDVD() && GameState.getCurrentDirection() == kWest) {
+			if (_lookingAtLaundry)
+				_vm->getAllHotspots().activateOneHotspot(kCaldoriaLaundryZoomOutHotSpotID);
+			else
+				_vm->getAllHotspots().activateOneHotspot(kCaldoriaLaundryZoomInHotSpotID);
+		}
 		break;
 	case kCaldoria27:
 		if (GameState.isCurrentDoorOpen()) {
@@ -1405,11 +1799,28 @@ void Caldoria::clickInHotspot(const Input &input, const Hotspot *spot) {
 		startExtraSequence(kRightDrawerCloseNoKeys, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kCaldoriaMakeStickyBunsSpotID:
-		requestSpotSound(kCaldoriaReplicatorWrongChoiceIn, kCaldoriaReplicatorWrongChoiceOut, kFilterNoInput, 0);
+		requestSpotSound(kCaldoriaReplicatorWrongChoiceIn, kCaldoriaReplicatorWrongChoiceOut, kFilterNoInput, kSpotSoundCompletedFlag);
 		break;
 	case kCaldoriaMakeOJSpotID:
-		GameState.setCaldoriaMadeOJ(true);
-		startExtraSequence(kCreateOrangeJuice, kExtraCompletedFlag, kFilterNoInput);
+		if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) {
+			startExtraSequence(kCreateCornbread, kExtraCompletedFlag, kFilterNoInput);
+		} else {
+			requestSpotSound(kCaldoriaReplicatorOJChoiceIn, kCaldoriaReplicatorOJChoiceOut, kFilterNoInput, 0);
+			requestExtraSequence(kCreateOrangeJuice, kExtraCompletedFlag, kFilterNoInput);
+		}
+		break;
+	case kCaldoriaCornbreadHotSpotID:
+		doArthurJoyride();
+		break;
+	case kCaldoriaLaundryZoomInHotSpotID:
+		if (_vm->isDVD()) {
+			startExtraSequence(kWashingMachineZoomIn, kExtraCompletedFlag, kFilterNoInput);
+			requestDelay(30, 10, kFilterNoInput, kDelayCompletedFlag);
+			requestSpotSound(kCaldoriaLaundryIntro1In, kCaldoriaLaundryIntro2Out, kFilterNoInput, kSpotSoundCompletedFlag);
+		}
+		break;
+	case kCaldoriaLaundryZoomOutHotSpotID:
+		startExtraSequence(kWashingMachineZoomOut, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kCaBedroomVidPhoneActivationSpotID:
 		newInteraction(kCaldoriaMessagesInteractionID);
@@ -1491,19 +1902,29 @@ void Caldoria::clickInHotspot(const Input &input, const Hotspot *spot) {
 
 void Caldoria::clickOnDoorbell(const HotSpotID doorBellSpotID) {
 	uint32 extra;
+	Sound doorbellSound;
 	ExtraTable::Entry entry;
+	Input input;
 
 	switch (doorBellSpotID) {
 	case kCaldoria20DoorbellSpotID:
+		if (_vm->isDVD())
+			doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH5.AIFF");
 		extra = kCaldoria20Doorbell;
 		break;
 	case kCaldoria21DoorbellSpotID:
+		if (_vm->isDVD())
+			doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH4.AIFF");
 		extra = kCaldoria21Doorbell;
 		break;
 	case kCaldoria26DoorbellSpotID:
+		if (_vm->isDVD())
+			doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH3.AIFF");
 		extra = kCaldoria26Doorbell;
 		break;
 	case kCaldoria29DoorbellSpotID:
+		if (_vm->isDVD())
+			doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH1.AIFF");
 		extra = kCaldoria29Doorbell;
 		break;
 	case kCaldoria34DoorbellSpotID:
@@ -1518,7 +1939,51 @@ void Caldoria::clickOnDoorbell(const HotSpotID doorBellSpotID) {
 
 	getExtraEntry(extra, entry);
 	showViewFrame(entry.movieStart);
-	requestSpotSound(kCaldoriaNobodyHomeIn, kCaldoriaNobodyHomeOut, kFilterNoInput, kSpotSoundCompletedFlag);
+	if (_vm->isDVD() && doorBellSpotID != kCaldoria34DoorbellSpotID && doorBellSpotID != kCaldoria35DoorbellSpotID) {
+		_vm->_cursor->hide();
+		doorbellSound.setVolume(_vm->getSoundFXLevel());
+		doorbellSound.playSound();
+		while (doorbellSound.isPlaying() && !_vm->shouldQuit()) {
+			InputDevice.getInput(input, kFilterNoInput);
+
+			_vm->checkCallBacks();
+			_vm->refreshDisplay();
+			_vm->_system->delayMillis(10);
+		}
+		if (_vm->shouldQuit())
+			return;
+		_vm->_cursor->hideUntilMoved();
+		updateViewFrame();
+	} else {
+		requestSpotSound(kCaldoriaNobodyHomeIn, kCaldoriaNobodyHomeOut, kFilterNoInput, kSpotSoundCompletedFlag);
+	}
+}
+
+void Caldoria::cantMoveThatWay(CanOpenDoorReason reason) {
+	switch (reason) {
+	case kCantMoveDoorClosed:
+	case kCantMoveDoorLocked:
+		openDoor();
+		break;
+	case kCantMoveBlocked:
+		switch (GameState.getCurrentRoomAndView()) {
+		case MakeRoomView(kCaldoria20, kWest):
+		case MakeRoomView(kCaldoria21, kEast):
+		case MakeRoomView(kCaldoria26, kSouth):
+		case MakeRoomView(kCaldoria29, kSouth):
+		case MakeRoomView(kCaldoria34, kWest):
+		case MakeRoomView(kCaldoria35, kEast):
+			cantOpenDoor(kCantOpenLocked);
+			break;
+		default:
+			zoomUpOrBump();
+			break;
+		}
+		break;
+	default:
+		bumpIntoWall();
+		break;
+	}
 }
 
 CanOpenDoorReason Caldoria::canOpenDoor(DoorTable::Entry &entry) {
@@ -1606,6 +2071,9 @@ void Caldoria::pickedUpItem(Item *item) {
 }
 
 void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
+	Input input;
+	Sound cardBombVoice;
+
 	switch (item->getObjectID()) {
 	case kKeyCard:
 		Neighborhood::dropItemIntoRoom(item, dropSpot);
@@ -1629,7 +2097,26 @@ void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
 		_utilityFuse.lightFuse();
 		GameState.setCaldoriaFuseTimeLimit(kCardBombCountDownTime);
 		loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop);
+		if (_vm->isDVD()) {
+			InputDevice.getInput(input, kFilterAllInput);
+			if (JMPPPInput::isEasterEggModifierInput(input))
+				cardBombVoice.initFromAIFFFile("Sounds/Caldoria/Card Bomb.Geno.aiff");
+			else
+				cardBombVoice.initFromAIFFFile("Sounds/Caldoria/Card Bomb.44K.aiff");
+			cardBombVoice.playSound();
+			while (cardBombVoice.isPlaying() && !_vm->shouldQuit()) {
+				InputDevice.getInput(input, kFilterNoInput);
+
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				_vm->_system->delayMillis(10);
+			}
+			if (_vm->shouldQuit())
+				return;
+		}
 		GameState.setScoringUsedCardBomb(true);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurCaldoriaUsedCardBomb);
 		break;
 	case kStunGun:
 		GameState.setCaldoriaGunAimed(true);
@@ -1640,6 +2127,8 @@ void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
 		_gunSprite->moveElementTo(kCaldoriaGunSpriteLeft, kCaldoriaGunSpriteTop);
 		_gunSprite->startDisplaying();
 		_gunSprite->show();
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA17", kArthurCaldoriaStunningSinclair);
 		break;
 	default:
 		Neighborhood::dropItemIntoRoom(item, dropSpot);
@@ -1647,6 +2136,35 @@ void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
 	}
 }
 
+void Caldoria::playMissingFloorSound() {
+	Input input;
+	Sound elevatorVoice;
+
+	InputDevice.getInput(input, kFilterAllInput);
+	if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) {
+		_vm->_cursor->hide();
+		elevatorVoice.initFromAIFFFile("Sounds/Caldoria/Elevator Denied.32K.aiff");
+		elevatorVoice.setVolume(_vm->getSoundFXLevel());
+		elevatorVoice.playSound();
+		while (elevatorVoice.isPlaying() && !_vm->shouldQuit()) {
+			InputDevice.getInput(input, kFilterNoInput);
+
+			_vm->checkCallBacks();
+			_vm->refreshDisplay();
+			_vm->_system->delayMillis(10);
+		}
+		if (_vm->shouldQuit())
+			return;
+		_vm->_cursor->hideUntilMoved();
+		updateElevatorMovie();
+	} else {
+		requestSpotSound(kCaldoriaNoOtherFloorIn,
+							kCaldoriaNoOtherFloorOut,
+							kFilterNoInput,
+							kSpotSoundCompletedFlag);
+	}
+}
+
 void Caldoria::takeElevator(uint startFloor, uint endFloor) {
 	_croppedMovie.stop();
 	_croppedMovie.setSegment(0, _croppedMovie.getDuration());
@@ -1660,12 +2178,12 @@ void Caldoria::takeElevator(uint startFloor, uint endFloor) {
 		case 2:
 			_croppedMovie.setTime(k1To2Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 3:
 			_croppedMovie.setTime(k1To3Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 4:
 			_croppedMovie.setSegment(k1To4Start, k1To4Stop);
@@ -1692,12 +2210,12 @@ void Caldoria::takeElevator(uint startFloor, uint endFloor) {
 		case 2:
 			_croppedMovie.setTime(k4To2Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 3:
 			_croppedMovie.setTime(k4To3Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 4:
 			// Do nothing.
@@ -1721,12 +2239,12 @@ void Caldoria::takeElevator(uint startFloor, uint endFloor) {
 		case 2:
 			_croppedMovie.setTime(k5To2Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 3:
 			_croppedMovie.setTime(k5To3Time);
 			_croppedMovie.redrawMovieWorld();
-			requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);
+			playMissingFloorSound();
 			break;
 		case 4:
 			_croppedMovie.setSegment(k5To4Start, k5To4Stop);
@@ -1984,4 +2502,66 @@ Common::String Caldoria::getSoundSpotsName() {
 	return "Sounds/Caldoria/Caldoria Spots";
 }
 
+void Caldoria::doArthurJoyride() {
+	Video::VideoDecoder *video = 0;
+	BiochipItem *item;
+
+	setNextHandler(_vm);
+	throwAwayInterface();
+	loadLoopSound1("");
+
+	_vm->_cursor->hide();
+
+#ifdef USE_THEORADEC
+	video = new Video::TheoraDecoder();
+	if (!video->loadFile("Images/Caldoria/A12RD.ogg")) {
+		delete video;
+		video = 0;
+	}
+#endif
+
+	if (!video) {
+		video = new Video::QuickTimeDecoder();
+		if (!video->loadFile("Images/Caldoria/A12RD.movie"))
+			error("Could not load joyride video");
+	}
+
+	video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF));
+	video->start();
+
+	while (!_vm->shouldQuit() && !video->endOfVideo()) {
+		if (video->needsUpdate()) {
+			const Graphics::Surface *frame = video->decodeNextFrame();
+
+			if (frame) {
+				g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h);
+				g_system->updateScreen();
+			}
+		}
+
+		Common::Event event;
+		while (g_system->getEventManager()->pollEvent(event))
+			;
+
+		g_system->delayMillis(10);
+	}
+
+	delete video;
+
+	if (_vm->shouldQuit())
+		return;
+
+	reinstateMonocleInterface();
+	loadAmbientLoops();
+	updateViewFrame();
+	if (!_vm->playerHasItemID(kArthurBiochip)) {
+		item = (BiochipItem *)_vm->getAllItems().findItemByID(kArthurBiochip);
+		_vm->addItemToBiochips(item);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA06", kArthurCaldoriaFinishedJoyride);
+	}
+	g_interface->setCurrentBiochipID(kArthurBiochip);
+	GameState.setEasterEgg(false);
+}
+
 } // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.h b/engines/pegasus/neighborhood/caldoria/caldoria.h
index 3d6a155..982789f 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.h
@@ -195,6 +195,7 @@ static const HotSpotID kCaldoriaRoofElevatorSpotID = 5065;
 static const HotSpotID kCaldoriaRoofDoorSpotID = 5066;
 static const HotSpotID kCaldoriaRoofCardDropSpotID = 5067;
 static const HotSpotID kCaldoria53EastSinclairTargetSpotID = 5068;
+static const HotSpotID kCaldoriaCornbread = 5069;
 
 // Extra sequence IDs.
 
@@ -383,6 +384,9 @@ static const DisplayElementID kCaldoriaUtilityID = kCaldoriaMessagesID + 1;
 static const DisplayElementID kCaldoriaBombGridID = kCaldoriaUtilityID + 1;
 static const DisplayElementID kCaldoriaBombTimerID = kCaldoriaBombGridID + 1;
 
+static const TimeValue kCaldoria4DInstructionsIn = 28013;
+static const TimeValue kCaldoria4DInstructionsOut = 29730;
+
 static const TimeValue kCaldoria4DBlankChoiceIn = 29730;
 static const TimeValue kCaldoria4DBlankChoiceOut = 33910;
 
@@ -445,6 +449,7 @@ protected:
 
 	void init();
 	void start();
+	void throwAwayInterface();
 
 	void setUpRoofTop();
 
@@ -472,7 +477,10 @@ protected:
 	void arriveAtCaldoriaDeath();
 	void turnTo(const DirectionConstant);
 	void zoomTo(const Hotspot *);
+	void leftButton(const Input &);
+	void rightButton(const Input &);
 	void downButton(const Input &);
+	void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits);
 	void receiveNotification(Notification *, const NotificationFlags);
 	InputBits getInputFilter();
 	void activateHotspots();
@@ -483,6 +491,7 @@ protected:
 
 	Hotspot *getItemScreenSpot(Item *, DisplayElement *);
 	void dropItemIntoRoom(Item *, Hotspot *);
+	void playMissingFloorSound();
 	void takeElevator(uint, uint);
 	void updateElevatorMovie();
 	void openElevatorMovie();
@@ -495,7 +504,9 @@ protected:
 	void zoomToSinclair();
 	void playEndMessage();
 	void checkInterruptSinclair();
+	void doArthurJoyride();
 
+	void cantMoveThatWay(CanMoveForwardReason);
 	CanOpenDoorReason canOpenDoor(DoorTable::Entry &);
 	void doorOpened();
 
@@ -505,6 +516,15 @@ protected:
 
 	const Hotspot *_zoomOutSpot;
 
+	Hotspot _laundryZoomInSpot;
+	Hotspot _laundryZoomOutSpot;
+	Hotspot _cornbreadSpot;
+
+	Movie _extraMovie;
+	NotificationCallBack _extraMovieCallBack;
+
+	bool _lookingAtLaundry;
+
 	FuseFunction _utilityFuse;
 
 	long _sinclairLoopCount;
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp
index 0494753..a4b0276 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp
@@ -210,7 +210,8 @@ void Caldoria4DSystem::useIdleTime() {
 void Caldoria4DSystem::initInteraction() {
 	setSpritesMovie();
 
-	_owner->loadLoopSound1("Sounds/Caldoria/Rock.aiff");
+	playSound("Rock");
+	_owner->playSpotSoundSync(kCaldoria4DInstructionsIn, kCaldoria4DInstructionsOut);
 	loopExtra(k4DIslandLoop);
 }
 
@@ -243,8 +244,7 @@ void Caldoria4DSystem::handleInput(const Input &input, const Hotspot *cursorSpot
 
 void Caldoria4DSystem::activateHotspots() {
 	GameInteraction::activateHotspots();
-	if (_whichMenu == k4DAudioMenu)
-		g_allHotspots.activateOneHotspot(kCa4DChoice4SpotID);
+	g_allHotspots.activateOneHotspot(kCa4DChoice4SpotID);
 }
 
 void Caldoria4DSystem::clickInHotspot(const Input &input, const Hotspot *spot) {
@@ -335,7 +335,7 @@ void Caldoria4DSystem::makeRockChoice() {
 	if (_audioChoice != k4DRockChoice) {
 		_audioChoice = k4DRockChoice;
 		setSpritesMovie();
-		_owner->loadLoopSound1("Sounds/Caldoria/Rock.aiff");
+		playSound("Rock");
 	}
 }
 
@@ -343,7 +343,7 @@ void Caldoria4DSystem::makeOrchestralChoice() {
 	if (_audioChoice != k4DOrchestralChoice) {
 		_audioChoice = k4DOrchestralChoice;
 		setSpritesMovie();
-		_owner->loadLoopSound1("Sounds/Caldoria/Orchestral.aiff");
+		playSound("Orchestral");
 	}
 }
 
@@ -351,7 +351,7 @@ void Caldoria4DSystem::makeRhythmsChoice() {
 	if (_audioChoice != k4DRhythmsChoice) {
 		_audioChoice = k4DRhythmsChoice;
 		setSpritesMovie();
-		_owner->loadLoopSound1("Sounds/Caldoria/Rhythms.aiff");
+		playSound("Rhythms");
 	}
 }
 
@@ -359,7 +359,7 @@ void Caldoria4DSystem::makeAcousticChoice() {
 	if (_audioChoice != k4DAcousticChoice) {
 		_audioChoice = k4DAcousticChoice;
 		setSpritesMovie();
-		_owner->loadLoopSound1("Sounds/Caldoria/Acoustic.aiff");
+		playSound("Acoustic");
 	}
 }
 
@@ -367,4 +367,14 @@ void Caldoria4DSystem::shutDown4DSystem() {
 	_whichMenu = k4DShuttingDown;
 }
 
+void Caldoria4DSystem::playSound(const Common::String &baseFileName) {
+	Common::String fileName = "Sounds/Caldoria/" + baseFileName;
+
+	// Updated DVD files
+	if (((PegasusEngine *)g_engine)->isDVD())
+		fileName += ".44K";
+
+	_owner->loadLoopSound1(fileName + ".aiff");
+}
+
 } // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h
index 1c5fa44..0d57d7c 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h
@@ -63,6 +63,8 @@ protected:
 	void useIdleTime();
 	void loopExtra(const ExtraID);
 
+	void playSound(const Common::String &baseFileName);
+
 	Movie _4DSpritesMovie;
 	TimeScale _4DSpritesScale;
 	uint _whichMenu;
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp b/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
index abf34d3..adfd77d 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
@@ -25,6 +25,7 @@
 
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/caldoria/caldoria.h"
 #include "pegasus/neighborhood/caldoria/caldoriabomb.h"
 
@@ -48,7 +49,9 @@ static const uint32 kOnTime3 = kOffTime2 + kFlashOnTime;
 static const uint32 kOffTime3 = kOnTime3 + kFlashOffTime;
 static const uint32 kOnTime4 = kOffTime3 + kFlashOnTime;
 
-static const HotSpotID kVertextHotSpotBaseID = 10000;
+// Bomb hotspots start at 20000 since the extra Caldoria hotspots start at 10000.
+// Assigning these vice versa causes a hotspot in level 4 to never activate for some reason.
+static const HotSpotID kVertextHotSpotBaseID = 20000;
 
 static const CoordType kVertextHotSpotWidth = 24;
 static const CoordType kVertextHotSpotHeight = 24;
@@ -1235,6 +1238,12 @@ void CaldoriaBomb::receiveNotification(Notification *notification, const Notific
 			_currentLevel = 0;
 			_lastVertex = -1;
 			startBombAmbient("Sounds/Caldoria/BmbLoop1.22K.AIFF");
+			if (g_arthurChip) {
+				if (((PegasusEngine *)g_engine)->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA14", kArthurCaldoriaSeeRoofBomb);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB28", kArthurCaldoriaSeeRoofBomb);
+			}
 			break;
 		case kCaldoria56BombStage2:
 		case kCaldoria56BombStage3:
@@ -1412,6 +1421,8 @@ void CaldoriaBomb::handleInput(const Input &input, const Hotspot *hotspot) {
 				_grid.hide();
 				_timer.hide();
 				_owner->startExtraSequence(kCaldoria56BombStage7, kExtraCompletedFlag, kFilterNoInput);
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurCaldoriaDisarmedNuke);
 				break;
 			}
 		}
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp b/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp
index ff4d181..9f487cb 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp
@@ -25,6 +25,7 @@
 
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/neighborhood.h"
 #include "pegasus/neighborhood/caldoria/caldoria.h"
 #include "pegasus/neighborhood/caldoria/caldoriamirror.h"
@@ -42,6 +43,11 @@ void CaldoriaMirror::openInteraction() {
 void CaldoriaMirror::initInteraction() {
 	_owner->setCurrentActivation(kActivateMirrorReady);
 	_owner->startExtraSequence(kCaBathroomGreeting, kExtraCompletedFlag, kFilterNoInput);
+	// The original made the player click to start each of the following sequences,
+	// which was unnecessary, so it is automated here.
+	_owner->startExtraSequenceSync(kCaBathroomGreeting, kFilterNoInput);
+	_owner->startExtraSequenceSync(kCaBathroomBodyFat, kFilterNoInput);
+	_owner->startExtraSequence(kCaBathroomStylistIntro, kExtraCompletedFlag, kFilterNoInput);
 }
 
 void CaldoriaMirror::closeInteraction() {
@@ -79,30 +85,18 @@ void CaldoriaMirror::activateHotspots() {
 
 void CaldoriaMirror::clickInHotspot(const Input &input, const Hotspot *spot) {
 	switch (spot->getObjectID()) {
-	case kCaBathroomMirrorSpotID:
-		switch (_owner->getLastExtra()) {
-		case kCaBathroomGreeting:
-			_owner->startExtraSequence(kCaBathroomBodyFat, kExtraCompletedFlag, kFilterNoInput);
-			break;
-		case kCaBathroomBodyFat:
-			_owner->startExtraSequence(kCaBathroomStylistIntro, kExtraCompletedFlag, kFilterNoInput);
-			break;
-		case kCaBathroomRetrothrash:
-			_owner->startExtraSequence(kCaBathroomRetrothrashReturn, kExtraCompletedFlag, kFilterNoInput);
-			break;
-		case kCaBathroomGeoWave:
-			_owner->startExtraSequence(kCaBathroomGeoWaveReturn, kExtraCompletedFlag, kFilterNoInput);
-			break;
-		}
-		break;
+	// The original made the player click through several interstitial screens before
+	// reaching the hairstyle menu, which was unnecessary, so it's skipped here.
 	case kCaHairStyle1SpotID:
-		_owner->startExtraSequence(kCaBathroomRetrothrash, kExtraCompletedFlag, kFilterNoInput);
+		_owner->startExtraSequenceSync(kCaBathroomRetrothrash, kFilterNoInput);
+		_owner->startExtraSequence(kCaBathroomRetrothrashReturn, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kCaHairStyle2SpotID:
 		_owner->startExtraSequence(kCaBathroomAgencyStandard, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kCaHairStyle3SpotID:
-		_owner->startExtraSequence(kCaBathroomGeoWave, kExtraCompletedFlag, kFilterNoInput);
+		_owner->startExtraSequenceSync(kCaBathroomGeoWave, kFilterNoInput);
+		_owner->startExtraSequence(kCaBathroomGeoWaveReturn, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	default:
 		GameInteraction::clickInHotspot(input, spot);
@@ -126,10 +120,10 @@ void CaldoriaMirror::receiveNotification(Notification *, const NotificationFlags
 		_owner->requestDeleteCurrentInteraction();
 		GameState.setScoringFixedHair(true);
 		GameState.setCaldoriaDoneHygiene(true);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA43", kArthurCaldoriaChoseAgencyHairStyle);
 		break;
 	}
-
-	allowInput(true);
 }
 
 } // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/mars/canyonchase.cpp b/engines/pegasus/neighborhood/mars/canyonchase.cpp
new file mode 100644
index 0000000..4435998
--- /dev/null
+++ b/engines/pegasus/neighborhood/mars/canyonchase.cpp
@@ -0,0 +1,529 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "pegasus/pegasus.h"
+#include "pegasus/neighborhood/mars/canyonchase.h"
+#include "pegasus/neighborhood/mars/mars.h"
+
+namespace Pegasus {
+
+// Segment start and end points.
+
+static const TimeValue kPrepStart = 0;
+static const TimeValue kPrepEnd = 3000;
+static const TimeValue kLaunchStart = kPrepEnd;
+static const TimeValue kLaunchEnd = 6640;
+static const TimeValue kBranch1Start = kLaunchEnd;
+static const TimeValue kBranch1End = 22240;
+static const TimeValue kBranch2Start = kBranch1End;
+static const TimeValue kBranch2End = 28440;
+static const TimeValue kBranch3Start = kBranch2End;
+static const TimeValue kBranch3End = 38640;
+static const TimeValue kBranch4Start = kBranch3End;
+static const TimeValue kBranch4End = 43880;
+static const TimeValue kBranch5Start = kBranch4End;
+static const TimeValue kBranch5End = 58680;
+static const TimeValue kExitStart = kBranch5End;
+static const TimeValue kExitEnd = 66480;
+static const TimeValue kExitLoopPoint = 66200;
+static const TimeValue kExitGenoPoint = 62560;
+
+// Death start and end points.
+
+static const TimeValue kDeath1Start = 0;
+static const TimeValue kDeath1End = 2400;
+static const TimeValue kDeath2Start = kDeath1End;
+static const TimeValue kDeath2End = 4720;
+static const TimeValue kDeath3Start = kDeath2End;
+static const TimeValue kDeath3End = 7120;
+static const TimeValue kDeath4Start = kDeath3End;
+static const TimeValue kDeath4End = 9280;
+static const TimeValue kDeath5Start = kDeath4End;
+static const TimeValue kDeath5End = 12000;
+
+// Chase state.
+
+enum {
+	kCanyonLaunch,
+	kCanyonBranch1Left,
+	kCanyonBranch1Right,
+	kCanyonBranch2Left,
+	kCanyonBranch2Right,
+	kCanyonBranch3Left,
+	kCanyonBranch4Left,
+	kCanyonBranch4Right,
+	kCanyonBranch5Left,
+	kCanyonBranch5Right,
+	kCanyonExit,
+	kCanyonLoop
+};
+
+void MusicTimerEvent::fire() {
+	canyonChase->musicTimerExpired(*this);
+}
+
+CanyonChase::CanyonChase(Neighborhood *handler) : ChaseInteraction(kMarsCanyonChaseInteractionID, handler,
+							kMarsCanyonChaseNotificationID, (PegasusEngine *)g_engine), _canyonMovie1(kNoDisplayElement),
+							_canyonMovie2(kNoDisplayElement), _deathMovie(kNoDisplayElement), _genoMovie(kNoDisplayElement) {
+	_currentMovie = NULL;
+	_currentCallBack = NULL;
+}
+
+void CanyonChase::startCanyonMusicLoop(void) {
+	FaderMoveSpec spec;
+
+	_musicLoop.loopSound();
+	spec.makeTwoKnotFaderSpec(10, 0, 0, 1, 255);
+	_musicFader.startFader(spec);
+}
+
+void CanyonChase::stopCanyonMusicLoop(const long ticks) {
+	FaderMoveSpec spec;
+
+	spec.makeTwoKnotFaderSpec(10, 0, 255, ticks, 0);
+	_musicFader.startFader(spec);
+}
+
+void CanyonChase::openInteraction() {	
+	_canyonMovie1.initFromMovieFile("Images/Mars/Canyon_hq1.mov");
+	_canyonMovie1.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_canyonMovie1.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop);
+	_canyonMovie1.setDisplayOrder(kShuttleMonitorOrder);
+
+	_canyon1CallBack.setNotification(&_chaseNotification);
+	_canyon1CallBack.initCallBack(&_canyonMovie1, kCallBackAtExtremes);
+	_canyon1CallBack.setCallBackFlag(kChaseEnteredBranchZone);
+	_canyon1CallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_canyonMovie2.initFromMovieFile("Images/Mars/Canyon_hq2.mov");
+	_canyonMovie2.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_canyonMovie2.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop);
+	_canyonMovie2.setDisplayOrder(kShuttleMonitorOrder);
+
+	_canyon2CallBack.setNotification(&_chaseNotification);
+	_canyon2CallBack.initCallBack(&_canyonMovie2, kCallBackAtExtremes);
+	_canyon2CallBack.setCallBackFlag(kChaseEnteredBranchZone);
+	_canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_deathMovie.initFromMovieFile("Images/Mars/Canyon_hqD.mov");
+	_deathMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_deathMovie.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop);
+	_deathMovie.setDisplayOrder(kShuttleMonitorOrder);
+
+	_deathCallBack.setNotification(&_chaseNotification);
+	_deathCallBack.initCallBack(&_deathMovie, kCallBackAtExtremes);
+	_deathCallBack.setCallBackFlag(kChaseFinished);
+	_deathCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_musicLoop.attachFader(&_musicFader);
+	_musicLoop.initFromAIFFFile("Sounds/Mars/Canyon Loop.44K.16.AIFF");
+	_musicFader.setMasterVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+
+	ChaseInteraction::openInteraction();
+
+	_steerPict.setDisplayOrder(kShuttleMonitorOrder + 1);
+	_steerPict.moveElementTo(kShuttleSteerLeft, kShuttleSteerTop);
+}
+
+void CanyonChase::initInteraction() {
+	_steerPict.startDisplaying();
+
+	// Launch branch is identical in both movies
+	_canyonState = kCanyonLaunch;
+	_canyonMovie1.setSegment(kLaunchStart, kLaunchEnd - kDecisionTime);
+	_canyonMovie1.setTime(kLaunchStart);
+	switchTo(_canyonMovie1, _canyon1CallBack);
+	startCanyonMusicLoop();
+	ChaseInteraction::initInteraction();
+}
+
+void CanyonChase::closeInteraction() {
+	_canyonMovie1.stop();
+	_canyonMovie1.stopDisplaying();
+	_canyonMovie1.releaseMovie();
+	_canyon1CallBack.releaseCallBack();
+
+	_canyonMovie2.stop();
+	_canyonMovie2.stopDisplaying();
+	_canyonMovie2.releaseMovie();
+	_canyon2CallBack.releaseCallBack();
+
+	_deathMovie.stop();
+	_deathMovie.stopDisplaying();
+	_deathMovie.releaseMovie();
+	_deathCallBack.releaseCallBack();
+
+	_genoMovie.stop();
+	_genoMovie.stopDisplaying();
+	_genoMovie.releaseMovie();
+	_genoCallBack.releaseCallBack();
+
+	ChaseInteraction::closeInteraction();
+}
+
+void CanyonChase::receiveNotification(Notification *notification, const NotificationFlags flags) {
+	Input input;
+
+	if (notification == &_chaseNotification && flags == kChaseFinished) {
+		if (_canyonState == kCanyonLoop) {
+			// Swallow the notification if we loop back to the beginning
+			InputDevice.getInput(input, kFilterAllInput);
+			if (JMPPPInput::isEasterEggModifierInput(input)) {
+				stopCanyonMusicLoop(15);
+				doGenoChase();
+			} else {
+				_canyonMovie2.setSegment(kExitGenoPoint, kExitLoopPoint - kDecisionTime);
+				_canyonMovie2.setTime(kExitGenoPoint);
+				switchTo(_canyonMovie2, _canyon2CallBack);
+				_canyon2CallBack.setCallBackFlag(kChaseEnteredBranchZone);
+				_canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+				_canyonState = kCanyonLaunch;
+			}
+			return;
+		} else if (_canyonState != kCanyonExit) {
+			// We died
+			((Mars *)_owner)->die(kDeathRanIntoCanyonWall);
+		}
+	}
+	ChaseInteraction::receiveNotification(notification, flags);
+}
+
+void CanyonChase::setUpBranch() {
+	TimeValue branchStart, branchEnd;
+
+	branchStart = 0;
+	branchEnd = 0;
+	switch (_canyonState) {
+	case kCanyonLaunch:
+	case kCanyonExit:
+		branchStart = kLaunchEnd - kDecisionTime;
+		branchEnd = kLaunchEnd;
+		break;
+	case kCanyonBranch1Left:
+	case kCanyonBranch1Right:
+		branchStart = kBranch1End - kDecisionTime;
+		branchEnd = kBranch1End;
+		break;
+	case kCanyonBranch2Left:
+	case kCanyonBranch2Right:
+		branchStart = kBranch2End - kDecisionTime;
+		branchEnd = kBranch2End;
+		break;
+	case kCanyonBranch3Left:
+		branchStart = kBranch3End - kDecisionTime;
+		branchEnd = kBranch3End;
+		break;
+	case kCanyonBranch4Left:
+	case kCanyonBranch4Right:
+		branchStart = kBranch4End - kDecisionTime;
+		branchEnd = kBranch4End;
+		break;
+	case kCanyonBranch5Left:
+	case kCanyonBranch5Right:
+		branchStart = kBranch5End - kDecisionTime;
+		branchEnd = kBranch5End;
+		break;
+	default:
+		break;
+	}
+
+	_currentMovie->setSegment(branchStart, branchEnd);
+	// Need to call SetTime here in case we loop
+	_currentMovie->setTime(branchStart);
+
+	_currentCallBack->setCallBackFlag(kChaseExitedBranchZone);
+	_currentCallBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void CanyonChase::branchLeft() {
+	TimeValue branchStart, branchEnd;
+	Movie *movie;
+	NotificationCallBack *callBack;
+
+	branchStart = 0;
+	branchEnd = 0;
+	switch (_canyonState) {
+	case kCanyonLaunch:
+		branchStart = kBranch1Start;
+		branchEnd = kBranch1End - kDecisionTime;
+		_canyonState = kCanyonBranch1Left;
+		break;
+	case kCanyonBranch1Left:
+	case kCanyonBranch1Right:
+		branchStart = kBranch2Start;
+		branchEnd = kBranch2End - kDecisionTime;
+		_canyonState = kCanyonBranch2Left;
+		break;
+	case kCanyonBranch2Left:
+	case kCanyonBranch2Right:
+		branchStart = kBranch3Start;
+		branchEnd = kBranch3End - kDecisionTime;
+		_canyonState = kCanyonBranch3Left;
+		break;
+	case kCanyonBranch3Left:
+		branchStart = kBranch4Start;
+		branchEnd = kBranch4End - kDecisionTime;
+		_canyonState = kCanyonBranch4Left;
+		break;
+	case kCanyonBranch4Left:
+	case kCanyonBranch4Right:
+		branchStart = kBranch5Start;
+		branchEnd = kBranch5End - kDecisionTime;
+		_canyonState = kCanyonBranch5Left;
+		break;
+	case kCanyonBranch5Left:
+	case kCanyonBranch5Right:
+		dontBranch();
+		return;
+	default:
+		break;
+	}
+
+	// Left branches are in hq2 (except exit)
+	// Segment 5 branches are switched
+	if (_canyonState == kCanyonBranch5Left || _canyonState == kCanyonBranch5Right) {
+		movie = &_canyonMovie1;
+		callBack = &_canyon1CallBack;
+	} else {
+		movie = &_canyonMovie2;
+		callBack = &_canyon2CallBack;
+	}
+
+	movie->setSegment(branchStart, branchEnd);
+	movie->setTime(branchStart);
+
+	switchTo(*movie, *callBack);
+
+	callBack->setCallBackFlag(kChaseEnteredBranchZone);
+	callBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void CanyonChase::branchRight() {
+	TimeValue branchStart, branchEnd;
+	NotificationFlags flag;
+	Movie *movie;
+	NotificationCallBack *callBack;
+
+	branchStart = 0;
+	branchEnd = 0;
+	flag = 0;
+	switch (_canyonState) {
+	case kCanyonLaunch:
+		branchStart = kBranch1Start;
+		branchEnd = kBranch1End - kDecisionTime;
+		_canyonState = kCanyonBranch1Right;
+		flag = kChaseEnteredBranchZone;
+		break;
+	case kCanyonBranch1Left:
+	case kCanyonBranch1Right:
+		branchStart = kBranch2Start;
+		branchEnd = kBranch2End - kDecisionTime;
+		_canyonState = kCanyonBranch2Right;
+		flag = kChaseEnteredBranchZone;
+		break;
+	case kCanyonBranch2Left:
+	case kCanyonBranch2Right:
+		dontBranch();
+		return;
+	case kCanyonBranch3Left:
+		branchStart = kBranch4Start;
+		branchEnd = kBranch4End - kDecisionTime;
+		_canyonState = kCanyonBranch4Right;
+		flag = kChaseEnteredBranchZone;
+		break;
+	case kCanyonBranch4Left:
+	case kCanyonBranch4Right:
+		branchStart = kBranch5Start;
+		branchEnd = kBranch5End - kDecisionTime;
+		_canyonState = kCanyonBranch5Right;
+		flag = kChaseEnteredBranchZone;
+		break;
+	case kCanyonBranch5Left:
+	case kCanyonBranch5Right:
+		// Exit loop branch is in hq2
+		branchStart = kExitStart;
+		branchEnd = kExitEnd;
+		_canyonState = kCanyonExit;
+		flag = kChaseFinished;
+		startMusicTimer(kCanyonChaseStart + kCanyonChaseExitedTime - kExitStart, kMovieTicksPerSecond,
+						kCanyonExited);
+		break;
+	default:
+		break;
+	}
+
+	// Right branches are in hq1 (except exit)
+	// Segment 5 branches are switched
+	if (_canyonState == kCanyonBranch5Left || _canyonState == kCanyonBranch5Right) {
+		movie = &_canyonMovie2;
+		callBack = &_canyon2CallBack;
+	} else {
+		movie = &_canyonMovie1;
+		callBack = &_canyon1CallBack;
+	}
+
+	movie->setSegment(branchStart, branchEnd);
+	movie->setTime(branchStart);
+
+	switchTo(*movie, *callBack);
+
+	callBack->setCallBackFlag(flag);
+	callBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void CanyonChase::dontBranch() {
+	TimeValue branchStart, branchEnd;
+
+	branchStart = 0;
+	branchEnd = 0;
+	switch (_canyonState) {
+	case kCanyonLaunch:
+		branchStart = kDeath1Start;
+		branchEnd = kDeath1End;
+		break;
+	case kCanyonBranch1Left:
+	case kCanyonBranch1Right:
+		branchStart = kDeath2Start;
+		branchEnd = kDeath2End;
+		break;
+	case kCanyonBranch2Left:
+	case kCanyonBranch2Right:
+		branchStart = kDeath3Start;
+		branchEnd = kDeath3End;
+		break;
+	case kCanyonBranch3Left:
+		branchStart = kDeath4Start;
+		branchEnd = kDeath4End;
+		break;
+	case kCanyonBranch4Left:
+	case kCanyonBranch4Right:
+		branchStart = kDeath5Start;
+		branchEnd = kDeath5End;
+		break;
+	case kCanyonBranch5Left:
+	case kCanyonBranch5Right:
+		_canyonMovie2.setSegment(kExitStart, kExitGenoPoint);
+		_canyonMovie2.setTime(kExitStart);
+		switchTo(_canyonMovie2, _canyon2CallBack);
+		_canyon2CallBack.setCallBackFlag(kChaseFinished);
+		_canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		_canyonState = kCanyonLoop;
+		return;
+	default:
+		break;
+	}
+
+	_deathMovie.setSegment(branchStart, branchEnd);
+	_deathMovie.setTime(branchStart);
+
+	switchTo(_deathMovie, _deathCallBack);
+
+	startMusicTimer(10, 10, kCanyonRanIntoWall);
+}
+
+void CanyonChase::showControlsHint() {
+	((Mars *)_owner)->_lowerLeftShuttleMovie.setTime(kShuttleLowerLeftKeypadHintTime);
+	((Mars *)_owner)->_lowerLeftShuttleMovie.redrawMovieWorld();
+	ChaseInteraction::showControlsHint();
+}
+
+void CanyonChase::hideControlsHint() {
+	((Mars *)_owner)->_lowerLeftShuttleMovie.setTime(kShuttleLowerLeftCollisionTime);
+	((Mars *)_owner)->_lowerLeftShuttleMovie.redrawMovieWorld();
+	ChaseInteraction::hideControlsHint();
+}
+
+void CanyonChase::switchTo(Movie &movie, NotificationCallBack &callBack) {
+	if (_currentMovie != &movie) {
+		if (_currentMovie != NULL) {
+			_currentMovie->stop();
+			_currentMovie->hide();
+			_currentMovie->stopDisplaying();
+		}
+
+		_currentMovie = &movie;
+
+		_currentMovie->startDisplaying();
+		_currentMovie->show();
+		_currentMovie->start();
+	}
+
+	if (_currentCallBack != &callBack) {
+		_currentCallBack = &callBack;
+	}
+}
+
+void CanyonChase::startMusicTimer(TimeValue time, TimeScale scale, MusicTimerCode code) {
+	_musicFuse.primeFuse(time, scale);
+	_musicEvent.canyonChase = this;
+	_musicEvent.theEvent = code;
+	_musicFuse.setFunctor(new Common::Functor0Mem<void, MusicTimerEvent>(&_musicEvent, &MusicTimerEvent::fire));
+	_musicFuse.lightFuse();
+}
+
+void CanyonChase::musicTimerExpired(MusicTimerEvent &event) {
+	FaderMoveSpec spec;
+
+	switch (event.theEvent) {
+	case kCanyonRanIntoWall:
+		stopCanyonMusicLoop(5);
+		break;
+	case kCanyonExited:
+		spec.makeTwoKnotFaderSpec(20, 0, 255, 5, 160);
+		_musicFader.startFader(spec);
+		startMusicTimer(kCanyonChaseFadedTime, kMovieTicksPerSecond, kCanyonFaded);
+		break;
+	case kCanyonFaded:
+		spec.makeTwoKnotFaderSpec(10, 0, 160, 30, 0);
+		_musicFader.startFader(spec);
+		((Mars *)_owner)->startMarsTimer(kLaunchTubeDVDReachedTime, kMovieTicksPerSecond,
+											kMarsLaunchTubeReached);
+		break;
+	default:
+		break;
+	}
+}
+
+void CanyonChase::doGenoChase() {
+	_genoMovie.initFromMovieFile("Images/Mars/Canyon_hqG.mov");
+	_genoMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_genoMovie.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop);
+	_genoMovie.setDisplayOrder(kShuttleMonitorOrder);
+	_genoMovie.startDisplaying();
+	_genoMovie.show();
+	_genoMovie.start();
+
+	_genoCallBack.setNotification(&_chaseNotification);
+	_genoCallBack.initCallBack(&_genoMovie, kCallBackAtExtremes);
+	_genoCallBack.setCallBackFlag(kChaseFinished);
+	_genoCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_canyonState = kCanyonExit;
+
+	((Mars *)_owner)->startMarsTimer(_genoMovie.getDuration() - 5 * kMovieTicksPerSecond,
+										kMovieTicksPerSecond, kMarsLaunchTubeReached);
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/mars/canyonchase.h b/engines/pegasus/neighborhood/mars/canyonchase.h
new file mode 100644
index 0000000..5b40c64
--- /dev/null
+++ b/engines/pegasus/neighborhood/mars/canyonchase.h
@@ -0,0 +1,105 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PEGASUS_NEIGHBORHOOD_MARS_CANYONCHASE_H
+#define PEGASUS_NEIGHBORHOOD_MARS_CANYONCHASE_H
+
+#include "pegasus/chase.h"
+#include "pegasus/fader.h"
+#include "pegasus/movie.h"
+#include "pegasus/sound.h"
+
+namespace Pegasus {
+
+class CanyonChase;
+class Mars;
+
+enum MusicTimerCode {
+	kCanyonRanIntoWall,
+	kCanyonExited,
+	kCanyonFaded
+};
+
+struct MusicTimerEvent {
+	CanyonChase *canyonChase;
+	MusicTimerCode theEvent;
+
+	void fire();
+};
+
+class CanyonChase : public ChaseInteraction {
+friend class Mars;
+friend struct MusicTimerEvent;
+public:
+
+	CanyonChase(Neighborhood *);
+	virtual ~CanyonChase() {}
+
+protected:
+
+	void startCanyonMusicLoop();
+	void stopCanyonMusicLoop(const long);
+
+	void openInteraction();
+	void initInteraction();
+	void closeInteraction();
+
+	void receiveNotification(Notification *, const NotificationFlags);
+
+	void setUpBranch();
+	void branchLeft();
+	void branchRight();
+	void dontBranch();
+
+	void showControlsHint();
+	void hideControlsHint();
+
+	void switchTo(Movie &, NotificationCallBack &);
+	void startMusicTimer(TimeValue, TimeScale, MusicTimerCode);
+	void musicTimerExpired(MusicTimerEvent &);
+	void doGenoChase();
+
+	Movie _canyonMovie1;
+	Movie _canyonMovie2;
+	Movie _deathMovie;
+	Movie _genoMovie;
+	NotificationCallBack _canyon1CallBack;	
+	NotificationCallBack _canyon2CallBack;
+	NotificationCallBack _deathCallBack;
+	NotificationCallBack _genoCallBack;
+	Sound _musicLoop;
+	SoundFader _musicFader;
+	FuseFunction _musicFuse;
+
+	MusicTimerEvent _musicEvent;
+
+	Movie *_currentMovie;
+	NotificationCallBack *_currentCallBack;
+	short _canyonState;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/mars/constants.h b/engines/pegasus/neighborhood/mars/constants.h
index 82a7f03..f6c1724 100644
--- a/engines/pegasus/neighborhood/mars/constants.h
+++ b/engines/pegasus/neighborhood/mars/constants.h
@@ -32,6 +32,12 @@ namespace Pegasus {
 
 // Element Coordinates
 
+static const CoordType kPodScreenLeft = kNavAreaLeft + 88;
+static const CoordType kPodScreenTop = kNavAreaTop + 204;
+
+static const CoordType kPodSteerLeft = kNavAreaLeft + 212;
+static const CoordType kPodSteerTop = kNavAreaTop + 232;
+
 static const CoordType kUndoHiliteLeft = kNavAreaLeft + 140;
 static const CoordType kUndoHiliteTop = kNavAreaTop + 36;
 
@@ -99,6 +105,9 @@ static const CoordType kShuttleEnergyTop = 60;
 static const CoordType kShuttleEnergyWidth = 252;
 static const CoordType kShuttleEnergyHeight = 22;
 
+static const CoordType kShuttleSteerLeft = kShuttleWindowLeft + 136;
+static const CoordType kShuttleSteerTop = kShuttleWindowTop + 196;
+
 static const CoordType kPlanetStartLeft = kShuttleWindowLeft;
 static const CoordType kPlanetStartTop = kShuttleWindowTop + kShuttleWindowHeight;
 
@@ -130,11 +139,21 @@ static const TimeValue kShuttleSwingStart = 0;
 static const TimeValue kShuttleSwingStop = 5 * 600;
 
 static const TimeValue kCanyonChaseStart = kShuttleSwingStop;
-static const TimeValue kCanyonChaseStop = 60 * 600 + 43 * 600 + 14 * 40;
-
-static const TimeValue kLaunchTubeReachedTime = 60 * 600 + 38 * 600 - kCanyonChaseStart;
-static const TimeValue kCanyonChaseFinishedTime = kCanyonChaseStop - kCanyonChaseStart -
-											kLaunchTubeReachedTime;
+static const TimeValue kCanyonChaseCDStop = 60 * 600 + 43 * 600 + 14 * 40;
+static const TimeValue kCanyonChaseDVDStop = 60 * 600 + 50 * 600 + 12 * 40;
+
+static const TimeValue kCanyonChaseExitedTime = 60 * 600 + 40 * 600 + 13 * 40 - kCanyonChaseStart;
+static const TimeValue kCanyonChaseFadedTime = 60 * 600 + 43 * 600 + 6 * 40 - kCanyonChaseStart -
+											kCanyonChaseExitedTime;
+
+static const TimeValue kLaunchTubeCDReachedTime = 60 * 600 + 38 * 600 - kCanyonChaseStart;
+static const TimeValue kLaunchTubeDVDReachedTime = 60 * 600 + 45 * 600 - kCanyonChaseStart -
+											kCanyonChaseExitedTime - kCanyonChaseFadedTime;
+static const TimeValue kCanyonChaseCDFinishedTime = kCanyonChaseCDStop - kCanyonChaseStart -
+											kLaunchTubeCDReachedTime;
+static const TimeValue kCanyonChaseDVDFinishedTime = kCanyonChaseDVDStop - kCanyonChaseStart -
+											kCanyonChaseExitedTime - kCanyonChaseFadedTime -
+											kLaunchTubeDVDReachedTime;
 
 // Left shuttle.
 
@@ -183,6 +202,8 @@ static const TimeValue kShuttleLowerLeftTubeTime = 40;
 
 static const TimeValue kShuttleLowerLeftAutopilotTime = 80;
 
+static const TimeValue kShuttleLowerLeftKeypadHintTime = 120;
+
 // Lower Right shuttle.
 
 static const TimeValue kShuttleLowerRightOffTime = 0;
@@ -929,6 +950,11 @@ static const ExtraID kMarsMaze184WestLoop = 109;
 static const ExtraID kMarsMaze184WestDeath = 110;
 static const ExtraID kMars200DeathInBucket = 111;
 
+// Mars interactions.
+
+static const InteractionID kMarsTunnelPodInteractionID = 0;
+static const InteractionID kMarsCanyonChaseInteractionID = 1;
+
 static const ResIDType kReactorUndoHilitePICTID = 900;
 
 static const int16 kMars52Compass = 90;
diff --git a/engines/pegasus/neighborhood/mars/mars.cpp b/engines/pegasus/neighborhood/mars/mars.cpp
index 435bcd4..55e0ddc 100644
--- a/engines/pegasus/neighborhood/mars/mars.cpp
+++ b/engines/pegasus/neighborhood/mars/mars.cpp
@@ -25,16 +25,20 @@
 
 #include "common/events.h"
 #include "video/qt_decoder.h"
+#include "video/theora_decoder.h"
 
 #include "pegasus/cursor.h"
 #include "pegasus/energymonitor.h"
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/items/biochips/shieldchip.h"
 #include "pegasus/items/inventory/airmask.h"
+#include "pegasus/neighborhood/mars/canyonchase.h"
 #include "pegasus/neighborhood/mars/mars.h"
+#include "pegasus/neighborhood/mars/tunnelpod.h"
 
 namespace Pegasus {
 
@@ -44,6 +48,9 @@ static const int16 kMarsShieldPanelOffsetAngle = 22;
 
 static const CanMoveForwardReason kCantMoveRobotBlocking = kCantMoveLastReason + 1;
 
+static const ExtraID kMarsRobotBobSlow = 1000;
+static const ExtraID kMarsRobotGenoSlow = 1001;
+
 static const NotificationFlags kTimeForCanyonChaseFlag = kLastNeighborhoodNotificationFlag << 1;
 static const NotificationFlags kExplosionFinishedFlag = kTimeForCanyonChaseFlag << 1;
 static const NotificationFlags kTimeToTransportFlag = kExplosionFinishedFlag << 1;
@@ -52,6 +59,13 @@ static const NotificationFlags kMarsNotificationFlags = kTimeForCanyonChaseFlag
 													kExplosionFinishedFlag |
 													kTimeToTransportFlag;
 
+static const TimeValue kBucketClimbInTime = 1393980;
+static const TimeValue kBucketSeeGearRoomTime = 2240;
+static const TimeValue kBucketClimbOutTime = 1340;
+
+static const TimeValue kPodCautionDisplayedTime = 1631;
+static const TimeValue kPodCautionDismissedTime = 3889;
+
 static const TimeValue kLittleExplosionStart = 0 * 40;
 static const TimeValue kLittleExplosionStop = 24 * 40;
 
@@ -90,16 +104,18 @@ void MarsTimerEvent::fire() {
 }
 
 Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Mars", kMarsID),
-		_guessObject(kNoDisplayElement), _undoPict(kNoDisplayElement), _guessHistory(kNoDisplayElement),
-		_choiceHighlight(kNoDisplayElement), _shuttleInterface1(kNoDisplayElement), _shuttleInterface2(kNoDisplayElement),
-		_shuttleInterface3(kNoDisplayElement), _shuttleInterface4(kNoDisplayElement), _canyonChaseMovie(kNoDisplayElement),
-		_leftShuttleMovie(kNoDisplayElement), _rightShuttleMovie(kNoDisplayElement), _lowerLeftShuttleMovie(kNoDisplayElement),
-		_lowerRightShuttleMovie(kNoDisplayElement), _centerShuttleMovie(kNoDisplayElement),
-		_upperLeftShuttleMovie(kNoDisplayElement), _upperRightShuttleMovie(kNoDisplayElement),
-		_leftDamageShuttleMovie(kNoDisplayElement), _rightDamageShuttleMovie(kNoDisplayElement), _explosions(kNoDisplayElement),
-		_planetMovie(kNoDisplayElement), _junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID),
-		_gravitonChoiceSpot(kShuttleGravitonSpotID), _tractorChoiceSpot(kShuttleTractorSpotID),
-		_shuttleViewSpot(kShuttleViewSpotID), _shuttleTransportSpot(kShuttleTransportSpotID) {
+		_extraMovie(kNoDisplayElement), _podSteerMovie(kNoDisplayElement), _guessObject(kNoDisplayElement),
+		_undoPict(kNoDisplayElement), _guessHistory(kNoDisplayElement), _choiceHighlight(kNoDisplayElement),
+		_shuttleInterface1(kNoDisplayElement), _shuttleInterface2(kNoDisplayElement),
+		_shuttleInterface3(kNoDisplayElement), _shuttleInterface4(kNoDisplayElement),
+		_canyonChaseMovie(kNoDisplayElement), _leftShuttleMovie(kNoDisplayElement), _rightShuttleMovie(kNoDisplayElement),
+		_lowerLeftShuttleMovie(kNoDisplayElement), _lowerRightShuttleMovie(kNoDisplayElement),
+		_centerShuttleMovie(kNoDisplayElement), _upperLeftShuttleMovie(kNoDisplayElement),
+		_upperRightShuttleMovie(kNoDisplayElement), _leftDamageShuttleMovie(kNoDisplayElement),
+		_rightDamageShuttleMovie(kNoDisplayElement), _explosions(kNoDisplayElement), _planetMovie(kNoDisplayElement),
+		_junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID), _gravitonChoiceSpot(kShuttleGravitonSpotID),
+		_tractorChoiceSpot(kShuttleTractorSpotID), _shuttleViewSpot(kShuttleViewSpotID),
+		_shuttleTransportSpot(kShuttleTransportSpotID) {
 	_noAirFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::airStageExpired));
 	setIsItemTaken(kMarsCard);
 	setIsItemTaken(kAirMask);
@@ -126,12 +142,25 @@ void Mars::init() {
 
 	_neighborhoodNotification.notifyMe(this, kMarsNotificationFlags, kMarsNotificationFlags);
 
+	_extraMovieCallBack.setNotification(&_neighborhoodNotification);
+
 	_explosionCallBack.setNotification(&_neighborhoodNotification);
 	_explosionCallBack.setCallBackFlag(kExplosionFinishedFlag);
 
 	_weaponSelection = kNoWeapon;
 }
 
+GameInteraction *Mars::makeInteraction(const InteractionID interactionID) {
+	switch (interactionID) {
+	case kMarsTunnelPodInteractionID:
+		return new TunnelPod(this);
+	case kMarsCanyonChaseInteractionID:
+		return new CanyonChase(this);
+	default:
+		return NULL;
+	}
+}
+
 void Mars::flushGameState() {
 	g_energyMonitor->saveCurrentEnergyValue();
 }
@@ -144,6 +173,65 @@ void Mars::start() {
 	Neighborhood::start();
 }
 
+class ArthurOxygen50Action : public AIPlayMessageAction {
+public:
+	ArthurOxygen50Action();
+
+	virtual void performAIAction(AIRule *);
+};
+
+ArthurOxygen50Action::ArthurOxygen50Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false, kWarningInterruption) {
+}
+
+void ArthurOxygen50Action::performAIAction(AIRule *rule) {
+	if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur())
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA84", kArthurMarsOxygen50Warning);
+	else
+		AIPlayMessageAction::performAIAction(rule);
+}
+
+class ArthurOxygen25Action : public AIPlayMessageAction {
+public:
+	ArthurOxygen25Action();
+
+	virtual void performAIAction(AIRule *);
+};
+
+ArthurOxygen25Action::ArthurOxygen25Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false, kWarningInterruption) {
+}
+
+void ArthurOxygen25Action::performAIAction(AIRule *rule) {
+	if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur()) {
+		if (((PegasusEngine *)g_engine)->getRandomBit())
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA85", kArthurMarsOxygen25Warning);
+		else
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA87", kArthurMarsOxygen25Warning);
+	} else {
+		AIPlayMessageAction::performAIAction(rule);
+	}
+}
+
+class ArthurOxygen5Action : public AIPlayMessageAction {
+public:
+	ArthurOxygen5Action();
+
+	virtual void performAIAction(AIRule *);
+};
+
+ArthurOxygen5Action::ArthurOxygen5Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false, kWarningInterruption) {
+}
+
+void ArthurOxygen5Action::performAIAction(AIRule *rule) {
+	if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur()) {
+		if (((PegasusEngine *)g_engine)->getRandomBit())
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA86", kArthurMarsOxygen5Warning);
+		else
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA88", kArthurMarsOxygen5Warning);
+	} else {
+		AIPlayMessageAction::performAIAction(rule);
+	}
+}
+
 class AirMaskCondition : public AICondition {
 public:
 	AirMaskCondition(const uint32);
@@ -210,12 +298,18 @@ void Mars::setUpAIRules() {
 		g_AIArea->addAIRule(rule);
 
 		AirMaskCondition *airMask50Condition = new AirMaskCondition(50);
-		messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false);
+		if (_vm->isDVD())
+			messageAction = new ArthurOxygen50Action();
+		else
+			messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false);
 		AIRule *rule50 = new AIRule(airMask50Condition, messageAction);
 
 		AirMaskCondition *airMask25Condition = new AirMaskCondition(25);
 		AICompoundAction *compound = new AICompoundAction();
-		messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false);
+		if (_vm->isDVD())
+			messageAction = new ArthurOxygen25Action();
+		else
+			messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false);
 		compound->addAction(messageAction);
 		deactivate = new AIDeactivateRuleAction(rule50);
 		compound->addAction(deactivate);
@@ -223,7 +317,10 @@ void Mars::setUpAIRules() {
 
 		AirMaskCondition *airMask5Condition = new AirMaskCondition(5);
 		compound = new AICompoundAction;
-		messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false);
+		if (_vm->isDVD())
+			messageAction = new ArthurOxygen5Action();
+		else
+			messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false);
 		compound->addAction(messageAction);
 		deactivate = new AIDeactivateRuleAction(rule50);
 		compound->addAction(deactivate);
@@ -396,8 +493,155 @@ void Mars::cantMoveThatWay(CanMoveForwardReason reason) {
 }
 
 void Mars::moveForward() {
-	if (GameState.getCurrentRoom() == kMars02 || (GameState.getCurrentRoom() >= kMars05 && GameState.getCurrentRoom() <= kMars08))
+	if (GameState.getCurrentRoom() == kMars02 || (GameState.getCurrentRoom() >= kMars05 && GameState.getCurrentRoom() <= kMars08)) {
 		loadLoopSound2("");
+	} else if (_vm->isDVD()) {
+		Movie movie(kNoDisplayElement);
+		Input input;
+
+		if (!GameState.isTakenItemID(kCardBomb) &&
+			GameState.getCurrentRoom() == kMars60 &&
+			GameState.getCurrentDirection() == kWest) {
+			loadLoopSound1("");
+			loadLoopSound2("");
+			movie.initFromMovieFile("Images/Mars/MMbomb.mov");
+			movie.setVolume(_vm->getSoundFXLevel());
+			movie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+			movie.setDisplayOrder(kNavMovieOrder + 1);
+			movie.startDisplaying();
+			movie.show();
+			movie.start();
+
+			while (movie.isRunning() && !_vm->shouldQuit()) {
+				InputDevice.getInput(input, kFilterNoInput);
+
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				_vm->_system->delayMillis(10);
+			}
+
+			if (_vm->shouldQuit())
+				return;
+
+			movie.moveElementTo(0, 0);
+			_vm->_gfx->setCurSurface(_navMovie.getSurface());
+			movie.copyToCurrentPort();
+			_vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea());
+
+			movie.hide();
+			movie.stopDisplaying();
+			movie.releaseMovie();
+
+			didntFindBomb();
+			return;
+		} else if (!GameState.getWalkthroughMode() &&
+					GameState.getCurrentRoom() == kMarsMaze200 &&
+					GameState.getCurrentDirection() == kWest) {
+			ExitTable::Entry exitEntry;
+			Common::Rect pushBounds;
+			bool leavingBucket;
+
+			// Fall down the shaft immediately if we miss the climb-in
+			if (_navMovie.getTime() >= kBucketClimbInTime) {
+				_navMovie.stop();
+
+				movie.initFromMovieFile("Images/Mars/MMfall.mov");
+				movie.setVolume(_vm->getSoundFXLevel());
+				movie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+				movie.setDisplayOrder(kNavMovieOrder + 1);
+				movie.startDisplaying();
+				movie.show();
+				movie.start();
+
+				while (movie.isRunning() && !_vm->shouldQuit()) {
+					InputDevice.getInput(input, kFilterNoInput);
+
+					_vm->checkCallBacks();
+					_vm->refreshDisplay();
+					_vm->_system->delayMillis(10);
+				}
+
+				if (_vm->shouldQuit())
+					return;
+
+				movie.moveElementTo(0, 0);
+				_vm->_gfx->setCurSurface(_navMovie.getSurface());
+				movie.copyToCurrentPort();
+				_vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea());
+
+				movie.hide();
+				movie.stopDisplaying();
+				movie.releaseMovie();
+
+				die(kDeathMissedOreBucket);
+				return;
+			}
+			
+			canMoveForward(exitEntry);
+
+			leavingBucket = false;
+			_navMovie.stop();
+			_turnPush.getBounds(pushBounds);
+			_navMovie.moveElementTo(pushBounds.left, pushBounds.top);
+			_navMovie.show();
+			_navMovie.setFlags(0);
+
+			// Set segment so we can skip ahead as needed
+			// Ride up the shaft but don't try to get out
+			_navMovie.setSegment(exitEntry.movieStart, exitEntry.movieEnd - kBucketClimbOutTime);
+			_navMovie.setTime(exitEntry.movieStart);
+			_navMovie.start();
+			while (_navMovie.isRunning() && _navMovie.getTime() < exitEntry.movieEnd - kBucketSeeGearRoomTime) {
+				InputDevice.getInput(input, kFilterAllDirections);
+
+				if (input.upButtonDown() ||
+					input.downButtonDown() ||
+					input.leftButtonDown() ||
+					input.rightButtonDown()) {
+					_navMovie.stop();
+					_vm->getDeathSound().initFromAIFFFile("Sounds/Mars/Mars Maze Fall.AIFF");
+					_vm->getDeathSound().setVolume(_vm->getSoundFXLevel());
+					_vm->getDeathSound().playSound();
+					die(kDeathMissedOreBucket);
+					return;
+				}
+
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				g_system->delayMillis(10);
+			}
+
+			// We can see the gear room at this point so it's safe to try to get out
+			_navMovie.setTime(exitEntry.movieEnd - kBucketSeeGearRoomTime);
+			while (_navMovie.isRunning()) {
+				InputDevice.getInput(input, kFilterAllDirections);
+
+				if (input.upButtonAnyDown()) {
+					leavingBucket = true;
+				} else if (input.anyDirectionInput()) {
+					_navMovie.stop();
+					_vm->getDeathSound().initFromAIFFFile("Sounds/Mars/Mars Maze Fall.AIFF");
+					_vm->getDeathSound().setVolume(_vm->getSoundFXLevel());
+					_vm->getDeathSound().playSound();
+					die(kDeathMissedOreBucket);
+					return;
+				}
+
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				g_system->delayMillis(10);
+			}
+			_navMovie.stop();
+
+			if (leavingBucket) {
+				exitEntry.movieStart = exitEntry.movieEnd - kBucketClimbOutTime;
+				startExitMovie(exitEntry);
+			} else {
+				playDeathExtra(kMars200DeathInBucket, kDeathDidntLeaveBucket);
+			}
+			return;
+		}
+	}
 
 	Neighborhood::moveForward();
 }
@@ -709,6 +953,88 @@ void Mars::checkAirlockDoors() {
 	}
 }
 
+void Mars::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) {
+	Movie movie(kNoDisplayElement);
+	Input input;
+
+	if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kMars18, kNorth) &&
+		GameState.getMarsPodAtUpperPlatform()) {
+		movie.initFromMovieFile("Images/Mars/M45DF.movie");
+		movie.setVolume(_vm->getSoundFXLevel());
+		movie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+		movie.setDisplayOrder(kNavMovieOrder + 1);
+		movie.startDisplaying();
+		movie.show();
+		movie.start();
+
+		while (movie.isRunning() && !_vm->shouldQuit()) {
+			InputDevice.getInput(input, kFilterNoInput);
+
+			_vm->checkCallBacks();
+			_vm->refreshDisplay();
+			_vm->_system->delayMillis(10);
+		}
+
+		if (_vm->shouldQuit())
+			return;
+
+		movie.moveElementTo(0, 0);
+		_vm->_gfx->setCurSurface(_navMovie.getSurface());
+		movie.copyToCurrentPort();
+		_vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea());
+
+		movie.hide();
+		movie.stopDisplaying();
+		movie.releaseMovie();
+
+		Neighborhood::doorOpened();
+	} else {
+		Neighborhood::startDoorOpenMovie(startTime, stopTime);
+	}
+}
+
+void Mars::startExitMovie(const ExitTable::Entry &exitEntry) {
+	Movie movie(kNoDisplayElement);
+	Input input;
+
+	if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kMars18, kNorth) &&
+		GameState.getMarsPodAtUpperPlatform()) {
+		movie.initFromMovieFile("Images/Mars/M45DG.movie");
+		movie.setVolume(_vm->getSoundFXLevel());
+		movie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+		movie.setDisplayOrder(kNavMovieOrder + 1);
+		movie.startDisplaying();
+		movie.show();
+		movie.start();
+
+		while (movie.isRunning() && !_vm->shouldQuit()) {
+			InputDevice.getInput(input, kFilterNoInput);
+
+			_vm->checkCallBacks();
+			_vm->refreshDisplay();
+			_vm->_system->delayMillis(10);
+		}
+
+		if (_vm->shouldQuit())
+			return;
+
+		movie.moveElementTo(0, 0);
+		_vm->_gfx->setCurSurface(_navMovie.getSurface());
+		movie.copyToCurrentPort();
+		_vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea());
+
+		movie.hide();
+		movie.stopDisplaying();
+		movie.releaseMovie();
+
+		arriveAt(kMars32, kNorth);
+	} else {
+		Neighborhood::startExitMovie(exitEntry);
+	}
+	if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars43, kEast) && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA07", kArthurMarsEnteredShuttle);
+}
+
 int16 Mars::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) {
 	int16 angle = Neighborhood::getStaticCompassAngle(room, dir);
 
@@ -877,33 +1203,78 @@ void Mars::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec &co
 }
 
 void Mars::loadAmbientLoops() {
+	// Don't load an ambient loop if we died in a chase sequence
+	if (_vm->getEnergyDeathReason() == kDeathRanIntoCanyonWall || _vm->getEnergyDeathReason() == kDeathCollidedWithPod)
+		return;
+
 	RoomID room = GameState.getCurrentRoom();
 
 	if ((room >= kMars0A && room <= kMars21) || (room >= kMars41 && room <= kMars43)) {
-		if (GameState.getMarsSeenTimeStream())
-			loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF");
+		if (GameState.getMarsSeenTimeStream()) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/Mars/Gantry Ambient.32K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF");
+		}
 	} else if (room >= kMars22 && room <= kMars31South) {
-		loadLoopSound1("Sounds/Mars/Reception.02.22K.8.AIFF", 0x100 / 4);
+		if (_vm->isDVD()) // Updated for the DVD version
+			loadLoopSound1("Sounds/Mars/Reception.02.32K.16.AIFF", 0x100 / 4);
+		else
+			loadLoopSound1("Sounds/Mars/Reception.02.22K.8.AIFF", 0x100 / 4);
 	} else if (room >= kMars32 && room <= kMars34) {
-		loadLoopSound1("Sounds/Mars/Pod Room Ambient.22K.8.AIFF");
-	} else if (room == kMars35) {
-		if (getAirQuality(room) == kAirQualityVacuum)
-			loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF");
+		if (_vm->isDVD()) // Updated for the DVD version
+			loadLoopSound1("Sounds/Mars/Pod Room Ambient.32K.16.AIFF");
 		else
-			loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF", 0x100 / 2);
+			loadLoopSound1("Sounds/Mars/Pod Room Ambient.22K.8.AIFF");
+	} else if (room == kMars35) {
+		if (getAirQuality(room) == kAirQualityVacuum) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/Mars/Gear Room Ambient.44K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF");
+		} else {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/Mars/Gantry Ambient.32K.16.AIFF", 0x100 / 2);
+			else
+				loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF", 0x100 / 2);
+		}
 	} else if (room >= kMars36 && room <= kMars39) {
-		loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF");
+		if (_vm->isDVD()) // Updated for the DVD version
+			loadLoopSound1("Sounds/Mars/Gear Room Ambient.44K.16.AIFF");
+		else
+			loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF");
 	} else if (room >= kMars45 && room <= kMars51) {
-		loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF");
+		if (_vm->isDVD()) // Updated for the DVD version
+			loadLoopSound1("Sounds/Mars/Lower Mars Ambient.32K.16.AIFF");
+		else
+			loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF");
 	} else if (room >= kMars52 && room <= kMars58) {
-		loadLoopSound1("Sounds/Mars/ReactorLoop.22K.8.AIFF");
-	} else if (room == kMars60) {
-		if (getAirQuality(room) == kAirQualityVacuum)
-			loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF");
+		if (_vm->isDVD()) // Updated for the DVD version
+			loadLoopSound1("Sounds/Mars/ReactorLoop.44K.16.AIFF");
 		else
-			loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF", 0x100 / 2);
+			loadLoopSound1("Sounds/Mars/ReactorLoop.22K.8.AIFF");
+	} else if (room == kMars60) {
+		if (getAirQuality(room) == kAirQualityVacuum) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/Mars/Mars Maze Ambient.32K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF");
+		} else {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/Mars/Lower Mars Ambient.32K.16.AIFF", 0x100 / 2);
+			else
+				loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF", 0x100 / 2);
+		}
 	} else if (room >= kMarsMaze004 && room <= kMarsMaze200) {
-		loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF");
+		if (_vm->isDVD()) { // Updated for the DVD version
+			if (GameState.getEasterEgg() || room == kMarsMaze200 ||
+				(room == kMarsMaze199 && GameState.getCurrentDirection() == kWest))
+				loadLoopSound1("Sounds/Mars/Mars Maze Ambient.32K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/Mars/Mars Maze GenoLoop.32K.16.AIFF");
+		} else {
+			loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF");
+		}
 	} else if (room == kMarsRobotShuttle) {
 		loadLoopSound1("Sounds/Mars/Robot Shuttle.22K.8.AIFF");
 	}
@@ -1130,6 +1501,9 @@ void Mars::timerExpired(const uint32 eventType) {
 }
 
 void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
+	Input input;
+	InventoryItem *item;
+
 	switch (MakeRoomView(room, direction)) {
 	case MakeRoomView(kMars18, kNorth):
 		if (GameState.getMarsPodAtUpperPlatform())
@@ -1142,6 +1516,14 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		else
 			setCurrentAlternate(kAltMarsNormal);
 		break;
+	case MakeRoomView(kMars31South, kSouth):
+		if (!GameState.isTakenItemID(kMarsCard) && g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA05", kArthurMarsZoomedToKeyCard);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA96", kArthurMarsZoomedToKeyCard);
+		}
+		break;
 	case MakeRoomView(kMars35, kEast):
 	case MakeRoomView(kMars35, kWest):
 		if (GameState.getMarsAirlockOpen())
@@ -1155,6 +1537,8 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			setCurrentAlternate(kAltMars60AirlockEast);
 		else
 			setCurrentAlternate(kAltMars60AirlockWest);
+		if (!(g_airMask && g_airMask->getAirLeft() > 0) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurMarsInAirlockNoOxygen);
 		break;
 	case MakeRoomView(kMars45, kNorth):
 	case MakeRoomView(kMars45, kSouth):
@@ -1175,6 +1559,12 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			setCurrentAlternate(kAltMarsNormal);
 		else
 			setCurrentAlternate(kAltMarsPodAtMars45);
+		if (g_arthurChip && room == kMars46) {
+			if (direction == kEast && !GameState.isTakenItemID(kCrowbar))
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurMarsLeftPodNoCrowBar);
+			else if (direction == kWest && GameState.getMarsPodAtUpperPlatform())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA82", kArthurMarsLookAtEmptyTracks);
+		}
 		break;
 	case MakeRoomView(kMars48, kNorth):
 	case MakeRoomView(kMars48, kSouth):
@@ -1196,6 +1586,16 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		else
 			setCurrentAlternate(kAltMarsNormal);
 		break;
+	case MakeRoomView(kMarsMaze004, kWest):
+		if (_vm->isDVD() && GameState.getCurrentRoom() == kMars60) {
+			InputDevice.getInput(input, kFilterAllInput);
+			// Check easter egg modifier for the Geno mix
+			if (JMPPPInput::isEasterEggModifierInput(input))
+				GameState.setEasterEgg(true);
+			else
+				GameState.setEasterEgg(false);
+		}
+		break;
 	}
 
 	Neighborhood::arriveAt(room, direction);
@@ -1207,6 +1607,11 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		if (!GameState.getMarsSeenTimeStream())
 			startExtraLongSequence(kMarsArrivalFromTSA, kMars0AWatchShuttleDepart, kExtraCompletedFlag, kFilterNoInput);
 		break;
+	case MakeRoomView(kMars07, kNorth):
+		item = (InventoryItem *)g_allItems.findItemByID(kNitrogenCanister);
+		if (((g_airMask && g_airMask->getAirLeft() > 0) || item->getItemState() == kNitrogenFull) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA24", kArthurMarsSawWelcomeVideos);
+		break;
 	case MakeRoomView(kMars07, kSouth):
 	case MakeRoomView(kMars13, kNorth):
 		if (!GameState.getMarsHeardCheckInMessage()) {
@@ -1214,6 +1619,11 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			GameState.setMarsHeardCheckInMessage(true);
 		}
 		break;
+	case MakeRoomView(kMars41, kEast):
+	case MakeRoomView(kMars42, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundNoShuttlePresent);
+		break;
 	case MakeRoomView(kMars44, kWest):
 		if (GameState.getMarsReadyForShuttleTransport())
 			startUpFromFinishedSpaceChase();
@@ -1229,6 +1639,8 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 	case MakeRoomView(kMars11, kSouth):
 	case MakeRoomView(kMars12, kSouth):
 		setCurrentActivation(kActivationReadyForKiosk);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurMarsReadyForKiosk);
 		break;
 	case MakeRoomView(kMars15, kWest):
 		if (GameState.getMarsThreadedMaze() && !GameState.getMarsSecurityDown()) {
@@ -1253,8 +1665,11 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 	case MakeRoomView(kMars19, kNorth):
 	case MakeRoomView(kMars19, kSouth):
 	case MakeRoomView(kMars19, kWest):
-		if (GameState.getMarsThreadedMaze() && !GameState.getMarsSawRobotLeave())
+		if (GameState.getMarsThreadedMaze() && !GameState.getMarsSawRobotLeave()) {
 			forceStridingStop(kMars19, kWest, kAltMarsNormal);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA38", kArthurMarsExitedGearRoom);
+		}
 
 		if (GameState.getMarsThreadedMaze() && !GameState.getMarsSecurityDown())
 			forceStridingStop(kMars17, kWest, kAltMarsNormal);
@@ -1305,8 +1720,24 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			setCurrentActivation(kActivateReadyToPressurizeAirlock);
 		break;
 	case MakeRoomView(kMars39, kWest):
-		if (GameState.getLastRoom() == kMarsMaze200)
+		if (GameState.getLastRoom() == kMarsMaze200) {
 			GameState.setMarsPodAtUpperPlatform(false);
+			if (_vm->isDVD())
+				GameState.setEasterEgg(false);
+		}
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB40", kArthurMarsEnteredGearRoom);
+		break;
+	case MakeRoomView(kMars39, kNorth):
+	case MakeRoomView(kMars39, kSouth):
+	case MakeRoomView(kMars38, kNorth):
+	case MakeRoomView(kMars38, kSouth):
+	case MakeRoomView(kMars37, kNorth):
+	case MakeRoomView(kMars37, kSouth):
+	case MakeRoomView(kMars36, kNorth):
+	case MakeRoomView(kMars36, kSouth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA83", kArthurMarsLookAtGears);
 		break;
 	case MakeRoomView(kMars45, kSouth):
 		// Set up maze doors here.
@@ -1322,7 +1753,19 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		if (!GameState.getMarsSeenRobotAtReactor()) {
 			// Preload the looping sound...
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0, 0, 0);
-			startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+			if (!_vm->isDVD()) {
+				startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+			} else {
+				InputDevice.getInput(input, kFilterAllInput);
+				if (JMPPPInput::isEasterEggModifierInput(input)) {
+					if (_vm->getRandomBit())
+						startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+					else
+						startExtraSequence(kMarsRobotBobSlow, kExtraCompletedFlag, kFilterNoInput);
+				} else {
+					startExtraSequence(kMarsRobotGenoSlow, kExtraCompletedFlag, kFilterNoInput);
+				}
+			}
 		} else if (!GameState.getMarsAvoidedReactorRobot()) {
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
 			loopExtraSequence(kMars48RobotLoops);
@@ -1362,10 +1805,14 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			g_shield->setItemState(kShieldNormal);
 		g_energyMonitor->setEnergyDrainRate(kEnergyDrainNormal);
 		_vm->resetEnergyDeathReason();
+		if (GameState.isTakenItemID(kCardBomb) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb);
 		break;
+	case MakeRoomView(kMars52, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA11", kArthurMarsEnteredReactor);
 	case MakeRoomView(kMars52, kNorth):
 	case MakeRoomView(kMars52, kSouth):
-	case MakeRoomView(kMars52, kEast):
 	case MakeRoomView(kMars52, kWest):
 	case MakeRoomView(kMars54, kNorth):
 	case MakeRoomView(kMars54, kSouth):
@@ -1407,6 +1854,10 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 	case MakeRoomView(kMarsMaze007, kNorth):
 		launchMaze007Robot();
 		break;
+	case MakeRoomView(kMarsMaze009, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurMarsMazeReachedJunction);
+		break;
 	case MakeRoomView(kMarsMaze015, kSouth):
 		launchMaze015Robot();
 		break;
@@ -1429,6 +1880,18 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		GameState.setScoringThreadedMaze();
 		GameState.setMarsThreadedMaze(true);
 		break;
+	case MakeRoomView(kMarsMaze199, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA77", kArthurMarsFoundBuckets);
+		break;
+	case MakeRoomView(kMarsMaze200, kWest):
+		if (g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurMarsApproachedBuckets);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA76", kArthurMarsApproachedBuckets);
+		}
+		break;
 	case MakeRoomView(kMarsDeathRoom, kNorth):
 	case MakeRoomView(kMarsDeathRoom, kSouth):
 	case MakeRoomView(kMarsDeathRoom, kEast):
@@ -1456,6 +1919,8 @@ void Mars::shieldOff() {
 }
 
 void Mars::turnTo(const DirectionConstant direction) {
+	Input input;
+
 	switch (MakeRoomView(GameState.getCurrentRoom(), direction)) {
 	case MakeRoomView(kMars27, kNorth):
 	case MakeRoomView(kMars27, kSouth):
@@ -1481,6 +1946,8 @@ void Mars::turnTo(const DirectionConstant direction) {
 	case MakeRoomView(kMars11, kSouth):
 	case MakeRoomView(kMars12, kSouth):
 		setCurrentActivation(kActivationReadyForKiosk);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurMarsReadyForKiosk);		
 		break;
 	case MakeRoomView(kMars18, kNorth):
 		if (GameState.getMarsPodAtUpperPlatform())
@@ -1492,6 +1959,11 @@ void Mars::turnTo(const DirectionConstant direction) {
 			GameState.setMarsHeardCheckInMessage(true);
 		}
 		break;
+	case MakeRoomView(kMars41, kEast):
+	case MakeRoomView(kMars42, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundNoShuttlePresent);
+		break;
 	case MakeRoomView(kMars34, kSouth):
 	case MakeRoomView(kMars45, kNorth):
 		setCurrentActivation(kActivateMarsPodClosed);
@@ -1517,6 +1989,21 @@ void Mars::turnTo(const DirectionConstant direction) {
 		if (GameState.getMarsThreadedMaze())
 			GameState.setScoringThreadedGearRoom();
 		break;
+	case MakeRoomView(kMars39, kNorth):
+	case MakeRoomView(kMars39, kSouth):
+	case MakeRoomView(kMars38, kNorth):
+	case MakeRoomView(kMars38, kSouth):
+	case MakeRoomView(kMars37, kNorth):
+	case MakeRoomView(kMars37, kSouth):
+	case MakeRoomView(kMars36, kNorth):
+	case MakeRoomView(kMars36, kSouth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA83", kArthurMarsLookAtGears);
+		break;
+	case MakeRoomView(kMars46, kWest):
+		if (GameState.getMarsPodAtUpperPlatform() && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA82", kArthurMarsLookAtEmptyTracks);
+		break;
 	case MakeRoomView(kMars48, kNorth):
 		if (GameState.getMarsSeenRobotAtReactor() && !GameState.getMarsAvoidedReactorRobot())
 			die(kDeathDidntGetOutOfWay);
@@ -1525,7 +2012,19 @@ void Mars::turnTo(const DirectionConstant direction) {
 		if (!GameState.getMarsSeenRobotAtReactor()) {
 			// Preload the looping sound...
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0, 0, 0);
-			startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+			if (!_vm->isDVD()) {
+				startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+			} else {
+				InputDevice.getInput(input, kFilterAllInput);
+				if (JMPPPInput::isEasterEggModifierInput(input)) {
+					if (_vm->getRandomBit())
+						startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput);
+					else
+						startExtraSequence(kMarsRobotBobSlow, kExtraCompletedFlag, kFilterNoInput);
+				} else {
+					startExtraSequence(kMarsRobotGenoSlow, kExtraCompletedFlag, kFilterNoInput);
+				}
+			}
 		} else if (!GameState.getMarsAvoidedReactorRobot()) {
 			loopExtraSequence(kMars48RobotLoops);
 		} else if (GameState.isTakenItemID(kAirMask)) {
@@ -1541,6 +2040,8 @@ void Mars::turnTo(const DirectionConstant direction) {
 			setCurrentAlternate(kAltMarsTookMask);
 		else
 			setCurrentAlternate(kAltMarsNormal);
+		if (GameState.isTakenItemID(kCardBomb) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb);
 		break;
 	case MakeRoomView(kMars49, kSouth):
 		if (GameState.isTakenItemID(kAirMask))
@@ -1548,6 +2049,11 @@ void Mars::turnTo(const DirectionConstant direction) {
 		else
 			setCurrentActivation(kActivateMaskOnHolder);
 		break;
+	case MakeRoomView(kMars51, kWest):
+	case MakeRoomView(kMars50, kWest):
+		if (GameState.isTakenItemID(kCardBomb) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb);
+		break;
 	case MakeRoomView(kMars52, kNorth):
 	case MakeRoomView(kMars52, kSouth):
 	case MakeRoomView(kMars52, kEast):
@@ -1587,6 +2093,23 @@ void Mars::turnTo(const DirectionConstant direction) {
 	case MakeRoomView(kMarsMaze184, kWest):
 		launchMaze184Robot();
 		break;
+	case MakeRoomView(kMarsMaze199, kNorth):
+	case MakeRoomView(kMarsMaze199, kSouth):
+	case MakeRoomView(kMarsMaze199, kEast):
+	case MakeRoomView(kMarsMaze199, kWest):
+		if (_vm->isDVD())
+			loadAmbientLoops();
+		if (GameState.getCurrentDirection() == kWest && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA77", kArthurMarsFoundBuckets);
+		break;
+	case MakeRoomView(kMarsMaze200, kWest):
+		if (g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurMarsApproachedBuckets);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA76", kArthurMarsApproachedBuckets);
+		}
+		break;
 	}
 }
 
@@ -1891,7 +2414,8 @@ void Mars::pickedUpItem(Item *item) {
 	case kAirMask:
 		setCurrentActivation(kActivateHotSpotAlways);
 		if (!GameState.getScoringGotOxygenMask()) {
-			g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM48SB", false, kWarningInterruption);
+			if (g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM48SB", false, kWarningInterruption);
 			GameState.setScoringGotOxygenMask();
 		}
 		break;
@@ -1954,13 +2478,33 @@ void Mars::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
 		switch (item->getObjectID()) {
 		case kMarsCard:
 			Neighborhood::dropItemIntoRoom(item, dropSpot);
-			if (dropSpot && dropSpot->getObjectID() == kMars34NorthCardDropSpotID)
-				startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput);
+			if (dropSpot && dropSpot->getObjectID() == kMars34NorthCardDropSpotID) {
+				if (_vm->isDVD()) {
+					if (!GameState.getWalkthroughMode()) {
+						_interruptionFilter = kFilterNoInput;
+						_podSteerMovie.initFromMovieFile("Images/Mars/M45OMK.movie");
+						_podSteerMovie.setVolume(_vm->getSoundFXLevel());
+						_podSteerMovie.setDisplayOrder(kNavMovieOrder + 1);
+						_podSteerMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+						_podSteerMovie.startDisplaying();
+						_podSteerMovie.show();
+						_podSteerMovie.start();
+					} else {
+						startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput);
+					}
+					startMarsTimer(kPodCautionDisplayedTime, kMovieTicksPerSecond, kMarsPodCautionDisplayed);
+				} else {
+					startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput);
+				}
+			}
 			break;
 		case kNitrogenCanister:
 			Neighborhood::dropItemIntoRoom(item, dropSpot);
-			if (dropSpot && dropSpot->getObjectID() == kMars57DropNitrogenSpotID)
+			if (dropSpot && dropSpot->getObjectID() == kMars57DropNitrogenSpotID) {
 				startExtraSequence(kMars57FreezeLock, kExtraCompletedFlag, kFilterNoInput);
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurMarsUsedLiquidNitrogen);
+			}
 			break;
 		case kCrowbar:
 			_utilityFuse.stopFuse();
@@ -2088,6 +2632,69 @@ void Mars::turnRight() {
 	}
 }
 
+void Mars::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
+	TimeValue segmentStart = 0, segmentStop = 0;
+	bool loopSequence = false;
+	Common::Rect pushBounds;
+	NotificationFlags extraFlags;
+
+	switch (extraID) {
+	case kMarsRobotBobSlow:
+	case kMarsRobotGenoSlow:
+		_turnPush.getBounds(pushBounds);
+		
+		switch (extraID) {
+		case kMarsRobotBobSlow:
+			_extraMovie.initFromMovieFile("Images/Mars/M48RSB.movie");
+			break;
+		case kMarsRobotGenoSlow:
+			_extraMovie.initFromMovieFile("Images/Mars/M48RSA.movie");
+			break;
+		default:
+			break;
+		}
+		segmentStart = 0;
+		segmentStop = _extraMovie.getDuration();
+		loopSequence = false;
+		
+		_lastExtra = extraID;
+		_turnPush.hide();
+		
+		if (!loopSequence && g_AIArea)
+			g_AIArea->lockAIOut();
+		
+		extraFlags = flags;
+		_interruptionFilter = interruptionFilter;
+		// Stop the nav movie before doing anything else
+		_navMovie.stop();
+		_navMovie.stopDisplaying();
+		
+		_extraMovie.setVolume(_vm->getSoundFXLevel());
+		_extraMovie.moveElementTo(pushBounds.left, pushBounds.top);
+		_extraMovie.setDisplayOrder(kNavMovieOrder + 1);
+		_extraMovie.startDisplaying();
+		_extraMovie.show();
+		_extraMovie.setFlags(0);
+		_extraMovie.setSegment(segmentStart, segmentStop);
+		_extraMovie.setTime(segmentStart);
+		if (loopSequence)
+			_extraMovie.setFlags(kLoopTimeBase);
+		else
+			extraFlags |= kNeighborhoodMovieCompletedFlag;
+		_extraMovieCallBack.cancelCallBack();
+		_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
+		if (extraFlags != 0) {
+			_extraMovieCallBack.setCallBackFlag(extraFlags);
+			_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		}
+		_extraMovie.start();
+		break;
+	default:
+		Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+		break;
+	}
+}
+
 void Mars::receiveNotification(Notification *notification, const NotificationFlags flag) {
 	InventoryItem *item;
 
@@ -2113,6 +2720,8 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 											kMarsPodDepartedUpperPlatformOut);
 				GameState.setMarsHeardUpperPodMessage(true);
 			}
+			if (g_airMask && g_airMask->getAirLeft() > 0 && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA74", kArthurMarsRobotThrownPlayerWithMask);
 			break;
 		case kMarsInfoKioskIntro:
 			GameState.setScoringSawMarsKiosk();
@@ -2144,12 +2753,15 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			}
 			break;
 		case kMarsTurnOnPod:
-			item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard);
-			_vm->addItemToInventory(item);
-			GameState.setScoringTurnedOnTransport();
-			loadLoopSound1("");
-			loadLoopSound2("");
-			startExtraSequence(kMarsTakePodToMars45, kExtraCompletedFlag, kFilterNoInput);
+			if (!_vm->isDVD()) {
+				item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard);
+				_vm->addItemToInventory(item);
+				GameState.setScoringTurnedOnTransport();
+				loadLoopSound1("");
+				loadLoopSound2("");
+			}
+			if (!_vm->isDVD() || GameState.getWalkthroughMode())
+				startExtraSequence(kMarsTakePodToMars45, kExtraCompletedFlag, kFilterNoInput);
 			break;
 		case kMarsTakePodToMars45:
 			arriveAt(kMars45, kSouth);
@@ -2172,6 +2784,12 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			checkAirMask();
 			loadAmbientLoops();
 			break;
+		case kMarsRobotBobSlow:
+		case kMarsRobotGenoSlow:
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			// Fall through...
 		case kMars48RobotApproaches:
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
 			GameState.setMarsSeenRobotAtReactor(true);
@@ -2199,6 +2817,12 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			setCurrentActivation(kActivateMaskOnFiller);
 			setCurrentAlternate(kAltMarsMaskOnFiller);
 			GameState.setMarsMaskOnFiller(true);
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA13", kArthurMarsCantFillMask);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA80", kArthurMarsCantFillMask);
+			}
 			break;
 		case kMars58SpinLeft:
 		case kMars54SpinRight:
@@ -2247,6 +2871,14 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			setCurrentActivation(kActivateReactorAskLowerScreen);
 			break;
 		case kMars57LowerScreenClosed:
+			item = (InventoryItem *)_vm->getAllItems().findItemByID(kNitrogenCanister);
+			if (g_arthurChip) {
+				if (item->getItemState() == kNitrogenFull)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurMarsSawLockedPanel);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurMarsSawLockedPanelNoNitrogen);
+			}
+			// Fall through...
 		case kMars57ThawLock:
 			setCurrentActivation(kActivateReactorReadyForNitrogen);
 			GameState.setMarsLockFrozen(false);
@@ -2283,6 +2915,12 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 		case kMars57RunDiagnostics:
 			setCurrentActivation(kActivateReactorRanDiagnostics);
 			GameState.setScoringFoundCardBomb();
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundCardBomb);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB34", kArthurMarsFoundCardBomb);
+			}
 			break;
 		case kMars57BombExplodes:
 		case kMars57BombExplodesInGame:
@@ -2310,11 +2948,16 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 		case kMars57ExposeBomb:
 			setCurrentActivation(kActivateReactorBombExposed);
 			_privateFlags.setFlag(kMarsPrivateBombExposedFlag, true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA75", kArthurMarsDeactivatedCardBomb);
 			break;
 		case kMars57BackToNormal:
 			setCurrentActivation(kActivateReactorPlatformIn);
 			_privateFlags.setFlag(kMarsPrivateBombExposedFlag, false);
-			g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM51SW", false, kWarningInterruption);
+			if (g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM51SW", false, kWarningInterruption);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurMarsSolvedReactorGame);
 			break;
 		case kMars60WestSpinAirlockToEast:
 			GameState.setMarsAirlockOpen(true);
@@ -2336,6 +2979,19 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			break;
 		case kMarsRobotHeadOpen:
 			setCurrentActivation(kActivationRobotHeadOpen);
+			if (g_arthurChip) {
+				switch (_vm->getRandomNumber(2)) {
+				case 0:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurMarsRobotHeadOpen);
+					break;
+				case 1:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurMarsRobotHeadOpen);
+					break;
+				case 2:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurMarsRobotHeadOpen);
+					break;
+				}
+			}
 			break;
 		case kMarsRobotHeadClose:
 			recallToTSASuccess();
@@ -2364,12 +3020,12 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			_rightDamageShuttleMovie.hide();
 			playMovieSegment(&_rightShuttleMovie, kShuttleRightDestroyedStart, kShuttleRightDestroyedStop);
 			playSpotSoundSync(kShuttleDestroyedIn, kShuttleDestroyedOut);
-			throwAwayMarsShuttle();
+			transportOutFromSpaceChase(true);
 			reinstateMonocleInterface();
 			recallToTSASuccess();
 		}
 	} else if ((flag & kTimeToTransportFlag) != 0) {
-		transportToRobotShip();
+		transportOutFromSpaceChase(false);
 	}
 
 	if (g_AIArea)
@@ -2379,11 +3035,42 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 void Mars::spotCompleted() {
 	Neighborhood::spotCompleted();
 
-	if (GameState.getCurrentRoom() == kMarsRobotShuttle)
-		g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XN59WD", false, kWarningInterruption);
+	switch (GameState.getCurrentRoomAndView()) {
+	case MakeRoomView(kMars27, kNorth):
+	case MakeRoomView(kMars28, kNorth):
+		if (g_arthurChip) {
+			switch (_vm->getRandomNumber(2)) {
+			case 0:
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA09", kArthurMarsLookedAtGuards);
+				break;
+			case 1:
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurMarsLookedAtGuards);
+				break;
+			case 2:
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB32", kArthurMarsLookedAtGuards);
+				break;
+			}
+		}
+		break;
+	case MakeRoomView(kMarsRobotShuttle, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA79", kArthurMarsFoundDeadRobot);
+		if (g_AIArea->isChattyAI())
+			g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XN59WD", false, kWarningInterruption);
+		break;
+	}
+}
+
+void Mars::startUpFromFinishedTunnelPod() {
+	arriveAt(kMars45, kSouth);
+	if (g_AIArea != NULL)
+		g_AIArea->checkMiddleArea();
 }
 
 void Mars::doCanyonChase() {
+	Input input;
+	FaderMoveSpec spec;
+
 	GameState.setScoringEnteredShuttle();
 	setNextHandler(_vm);
 	throwAwayInterface();
@@ -2394,9 +3081,24 @@ void Mars::doCanyonChase() {
 	_spotSounds.initFromQuickTime(getSoundSpotsName());
 	_spotSounds.setVolume(_vm->getSoundFXLevel());
 
-	Video::VideoDecoder *video = new Video::QuickTimeDecoder();
-	if (!video->loadFile("Images/Mars/M44ESA.movie"))
-		error("Could not load interface->shuttle transition video");
+	Video::VideoDecoder *video = 0;
+
+#ifdef USE_THEORADEC
+	if (_vm->isDVD()) {
+		video = new Video::TheoraDecoder();
+
+		if (!video->loadFile("Images/Mars/M44ESA_hq.ogg")) {
+			delete video;
+			video = 0;
+		}
+	}
+#endif
+
+	if (!video) {
+		video = new Video::QuickTimeDecoder();
+		if (!video->loadFile("Images/Mars/M44ESA.movie"))
+			error("Could not load interface->shuttle transition video");
+	}
 
 	video->start();
 
@@ -2429,11 +3131,18 @@ void Mars::doCanyonChase() {
 	initOnePicture(&_shuttleInterface4, "Images/Mars/MCmain4.pict", kShuttleBackgroundOrder, kShuttle4Left,
 							kShuttle4Top, true);
 
-	initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon.movie",
+	if (_vm->isDVD())
+		initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon_hq1.mov",
+						kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true);
+	else
+		initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon.movie",
 						kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true);
 	_canyonChaseMovie.setVolume(_vm->getSoundFXLevel());
 
-	loadLoopSound1("Sounds/Mars/Inside Cockpit.22K.8.AIFF");
+	if (_vm->isDVD())
+		loadLoopSound1("Sounds/Mars/Inside Cockpit.44K.16.AIFF");
+	else
+		loadLoopSound1("Sounds/Mars/Inside Cockpit.22K.8.AIFF");
 
 	// Swing shuttle around...
 	playMovieSegment(&_canyonChaseMovie, kShuttleSwingStart, kShuttleSwingStop);
@@ -2465,6 +3174,12 @@ void Mars::doCanyonChase() {
 	initOneMovie(&_rightDamageShuttleMovie, "Images/Mars/Right Damage Shuttle.movie",
 			kShuttleStatusOrder, kShuttleRightEnergyLeft, kShuttleRightEnergyTop, false);
 
+	if (_vm->isDVD()) {
+		_musicLoop.attachFader(&_musicFader);
+		_musicLoop.initFromAIFFFile("Sounds/Mars/Canyon Loop.44K.16.AIFF");
+		_musicFader.setMasterVolume(_vm->getSoundFXLevel());
+	}
+
 	_centerShuttleMovie.show();
 	_centerShuttleMovie.setTime(kShuttleCenterBoardingTime);
 	playSpotSoundSync(kShuttleCockpitIn, kShuttleCockpitOut);
@@ -2538,10 +3253,38 @@ void Mars::doCanyonChase() {
 
 	loadLoopSound1("");
 
-	_canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseStop);
-	_canyonChaseMovie.start();
+	if (_vm->isDVD()) {
+		InputDevice.getInput(input, kFilterAllInput);
+		if (JMPPPInput::isEasterEggModifierInput(input)) {
+			initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon_hqG.mov",
+							kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true);
+			_canyonChaseMovie.setVolume(_vm->getSoundFXLevel());
+			_canyonChaseMovie.start();
+
+			startMarsTimer(_canyonChaseMovie.getDuration() - 5 * kMovieTicksPerSecond,
+							kMovieTicksPerSecond, kMarsLaunchTubeReached);
+		} else if (GameState.getWalkthroughMode()) {
+			_canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseDVDStop);
+			_canyonChaseMovie.start();
+
+			_musicLoop.loopSound();
+			spec.makeTwoKnotFaderSpec(10, 0, 0, 1, 255);
+			_musicFader.startFader(spec);
+
+			startMarsTimer(kCanyonChaseExitedTime, kMovieTicksPerSecond, kMarsCanyonChaseExited);
+		} else {
+			_canyonChaseMovie.stop();
+			_canyonChaseMovie.stopDisplaying();
+			_canyonChaseMovie.releaseMovie();
+
+			newInteraction(kMarsCanyonChaseInteractionID);
+		}
+	} else {
+		_canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseCDStop);
+		_canyonChaseMovie.start();
 
-	startMarsTimer(kLaunchTubeReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached);
+		startMarsTimer(kLaunchTubeCDReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached);
+	}
 }
 
 void Mars::startUpFromFinishedSpaceChase() {
@@ -2601,7 +3344,7 @@ void Mars::startUpFromFinishedSpaceChase() {
 
 	_lowerLeftShuttleMovie.show();
 
-	loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");
+	playSpaceAmbient();
 
 	initOneMovie(&_junk, "Images/Mars/Junk.movie", kShuttleJunkOrder, kShuttleJunkLeft,
 			kShuttleJunkTop, false);
@@ -2710,7 +3453,7 @@ void Mars::startUpFromSpaceChase() {
 
 	_lowerLeftShuttleMovie.show();
 
-	loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");
+	playSpaceAmbient();
 
 	initOneMovie(&_planetMovie, "Images/Mars/Planet.movie", kShuttlePlanetOrder,
 			kPlanetStartLeft, kPlanetStartTop, true);
@@ -2781,10 +3524,31 @@ void Mars::startUpFromSpaceChase() {
 }
 
 void Mars::setSoundFXLevel(const uint16 level) {
+	CanyonChase *chase;
+
 	Neighborhood::setSoundFXLevel(level);
 
-	if (_canyonChaseMovie.isMovieValid())
-		_canyonChaseMovie.setVolume(level);
+	if (_vm->isDVD()) {
+		if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars44, kWest) &&
+			_currentInteraction != NULL) {
+			chase = (CanyonChase *)_currentInteraction;
+			if (chase->_canyonMovie1.isMovieValid())
+				chase->_canyonMovie1.setVolume(level);
+			if (chase->_canyonMovie2.isMovieValid())
+				chase->_canyonMovie2.setVolume(level);
+			if (chase->_deathMovie.isMovieValid())
+				chase->_deathMovie.setVolume(level);
+			if (chase->_genoMovie.isMovieValid())
+				chase->_genoMovie.setVolume(level);
+			if (chase->_musicLoop.isSoundLoaded())
+				chase->_musicFader.setMasterVolume(level);
+		}
+		if (_musicLoop.isSoundLoaded())
+			_musicFader.setMasterVolume(level);
+	} else {
+		if (_canyonChaseMovie.isMovieValid())
+			_canyonChaseMovie.setVolume(level);
+	}
 
 	if (_explosions.isMovieValid())
 		_explosions.setVolume(level);
@@ -2799,36 +3563,71 @@ void Mars::startMarsTimer(TimeValue time, TimeScale scale, MarsTimerCode code) {
 }
 
 void Mars::marsTimerExpired(MarsTimerEvent &event) {
+	InventoryItem *item;
+	FaderMoveSpec spec;
 	Common::Rect r;
 	uint16 x, y;
 
 	switch (event.event) {
+	case kMarsPodCautionDisplayed:
+		item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard);
+		_vm->addItemToInventory(item);
+		startMarsTimer(kPodCautionDismissedTime, kMovieTicksPerSecond, kMarsPodCautionDismissed);
+		return;
+	case kMarsPodCautionDismissed:
+		_podSteerMovie.hide();
+		_podSteerMovie.stopDisplaying();
+		_podSteerMovie.releaseMovie();
+		_interruptionFilter = kFilterAllInput;
+		GameState.setScoringTurnedOnTransport();
+		loadLoopSound1("");
+		loadLoopSound2("");
+		if (!GameState.getWalkthroughMode())
+			newInteraction(kMarsTunnelPodInteractionID);
+		return;
+	// Bail out early for pod events so input is not filtered
+	case kMarsCanyonChaseExited:
+		spec.makeTwoKnotFaderSpec(20, 0, 255, 5, 160);
+		_musicFader.startFader(spec);
+		startMarsTimer(kCanyonChaseFadedTime, kMovieTicksPerSecond, kMarsCanyonChaseFaded);
+		break;
+	case kMarsCanyonChaseFaded:
+		spec.makeTwoKnotFaderSpec(10, 0, 160, 30, 0);
+		_musicFader.startFader(spec);
+		startMarsTimer(kLaunchTubeDVDReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached);
+		break;
 	case kMarsLaunchTubeReached:
 		_lowerLeftShuttleMovie.setTime(kShuttleLowerLeftTubeTime);
 		_lowerLeftShuttleMovie.redrawMovieWorld();
-		startMarsTimer(kCanyonChaseFinishedTime, kMovieTicksPerSecond, kMarsCanyonChaseFinished);
+		startMarsTimer(kCanyonChaseCDFinishedTime, kMovieTicksPerSecond, kMarsCanyonChaseFinished);
 		break;
 	case kMarsCanyonChaseFinished:
 		GameState.setScoringEnteredLaunchTube();
 
-		while (_canyonChaseMovie.isRunning()) {
-			_vm->checkCallBacks();
-			_vm->refreshDisplay();
-			_vm->_system->delayMillis(10);
-		}
+		if (_canyonChaseMovie.isMovieValid()) {
+			while (_canyonChaseMovie.isRunning()) {
+				_vm->checkCallBacks();
+				_vm->refreshDisplay();
+				_vm->_system->delayMillis(10);
+			}
 
-		_canyonChaseMovie.stop();
-		_canyonChaseMovie.stopDisplaying();
-		_canyonChaseMovie.releaseMovie();
+			_canyonChaseMovie.stop();
+			_canyonChaseMovie.stopDisplaying();
+			_canyonChaseMovie.releaseMovie();
+		}
 
 		_vm->_gfx->enableErase();
 
-		loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");
+		playSpaceAmbient();
 
-		playSpotSoundSync(kShuttleConfiguringIn, kShuttleConfiguringOut);
-		playSpotSoundSync(kShuttleGeneratingIn, kShuttleGeneratingOut);
-		playSpotSoundSync(kShuttleBreakawayIn, kShuttleBreakawayOut);
-		playSpotSoundSync(kMarsAtmosphericBreakawayIn, kMarsAtmosphericBreakawayOut);
+		if (!_vm->isDVD()) {
+			// Don't play a couple sounds in the DVD version; they were put into
+			// the canyon video.
+			playSpotSoundSync(kShuttleConfiguringIn, kShuttleConfiguringOut);
+			playSpotSoundSync(kShuttleGeneratingIn, kShuttleGeneratingOut);
+			playSpotSoundSync(kShuttleBreakawayIn, kShuttleBreakawayOut);
+			playSpotSoundSync(kMarsAtmosphericBreakawayIn, kMarsAtmosphericBreakawayOut);
+		}
 
 		initOneMovie(&_planetMovie, "Images/Mars/Planet.movie", kShuttlePlanetOrder, kPlanetStartLeft, kPlanetStartTop, true);
 		_planetMovie.setFlags(kLoopTimeBase);
@@ -3013,13 +3812,44 @@ void Mars::throwAwayMarsShuttle() {
 	loadLoopSound1("");
 }
 
-void Mars::transportToRobotShip() {
+void Mars::playSpaceAmbient() {
+	if (_vm->isDVD())
+		loadLoopSound1("Sounds/Mars/Space Ambient.44K.16.AIFF");
+	else
+		loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");
+}
+
+void Mars::transportOutFromSpaceChase(bool destroyedShip) {
 	throwAwayMarsShuttle();
 
-	Video::VideoDecoder *video = new Video::QuickTimeDecoder();
-	if (!video->loadFile("Images/Mars/M98EAE.movie"))
-		error("Could not load shuttle->interface transition video");
+	Video::VideoDecoder *video = 0;
+
+#ifdef USE_THEORADEC
+	if (_vm->isDVD()) {
+		video = new Video::TheoraDecoder();
+
+		if (destroyedShip) {
+			if (!video->loadFile("Images/Mars/M98EAP_hq.ogg")) {
+				delete video;
+				video = 0;
+			}
+		} else if (!video->loadFile("Images/Mars/M98EAE_hq.ogg")) {
+			delete video;
+			video = 0;
+		}
+	}
+#endif
+
+	if (!video) {
+		video = new Video::QuickTimeDecoder();
+		if (destroyedShip && _vm->isDVD()) {
+			if (!video->loadFile("Images/Mars/M98EAP.movie"))
+				error("Could not load shuttle->TSA transition video");
+		} else if (!video->loadFile("Images/Mars/M98EAE.movie"))
+			error("Could not load shuttle->interface transition video");
+	}
 
+	video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF));
 	video->start();
 
 	while (!_vm->shouldQuit() && !video->endOfVideo()) {
@@ -3042,18 +3872,20 @@ void Mars::transportToRobotShip() {
 	if (_vm->shouldQuit())
 		return;
 
-	reinstateMonocleInterface();
+	if (!destroyedShip) {
+		reinstateMonocleInterface();
 
-	g_energyMonitor->stopEnergyDraining();
-	g_energyMonitor->restoreLastEnergyValue();
-	_vm->resetEnergyDeathReason();
-	g_energyMonitor->startEnergyDraining();
+		g_energyMonitor->stopEnergyDraining();
+		g_energyMonitor->restoreLastEnergyValue();
+		_vm->resetEnergyDeathReason();
+		g_energyMonitor->startEnergyDraining();
 
-	arriveAt(kMarsRobotShuttle, kEast);
+		arriveAt(kMarsRobotShuttle, kEast);
 
-	_navMovie.stop();
-	_navMovie.setTime(_navMovie.getStart());
-	_navMovie.start();
+		_navMovie.stop();
+		_navMovie.setTime(_navMovie.getStart());
+		_navMovie.start();
+	}
 }
 
 const int kRobotTooStrong = 1;
diff --git a/engines/pegasus/neighborhood/mars/mars.h b/engines/pegasus/neighborhood/mars/mars.h
index 0859522..09b4faf 100644
--- a/engines/pegasus/neighborhood/mars/mars.h
+++ b/engines/pegasus/neighborhood/mars/mars.h
@@ -40,10 +40,16 @@
 
 namespace Pegasus {
 
+class CanyonChase;
 class InventoryItem;
 class Mars;
+class TunnelPod;
 
 enum MarsTimerCode {
+	kMarsPodCautionDisplayed,
+	kMarsPodCautionDismissed,
+	kMarsCanyonChaseExited,
+	kMarsCanyonChaseFaded,
 	kMarsLaunchTubeReached,
 	kMarsCanyonChaseFinished,
 	kMarsSpaceChaseFinished // Player ran out of time...
@@ -64,11 +70,15 @@ enum ShuttleWeaponSelection {
 };
 
 class Mars : public Neighborhood {
+friend class CanyonChase;
+friend class TunnelPod;
 friend struct MarsTimerEvent;
 public:
 	Mars(InputHandler *, PegasusEngine *);
 	virtual ~Mars();
 
+	virtual GameInteraction *makeInteraction(const InteractionID);
+
 	void flushGameState();
 
 	virtual uint16 getDateResID() const;
@@ -133,12 +143,16 @@ protected:
 	CanOpenDoorReason canOpenDoor(DoorTable::Entry &);
 	void openDoor();
 	void closeDoorOffScreen(const RoomID, const DirectionConstant);
+	void startDoorOpenMovie(const TimeValue, const TimeValue);
+	void startExitMovie(const ExitTable::Entry &);
 	int16 getStaticCompassAngle(const RoomID, const DirectionConstant);
 	void getExitCompassMove(const ExitTable::Entry &, FaderMoveSpec &);
 	void getExtraCompassMove(const ExtraTable::Entry &, FaderMoveSpec &);
 	void turnTo(const DirectionConstant);
+	void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits);
 	void receiveNotification(Notification *, const NotificationFlags);
 	void doorOpened();
+	void startUpFromFinishedTunnelPod();
 	void setUpReactorEnergyDrain();
 	Hotspot *getItemScreenSpot(Item *, DisplayElement *);
 	void lockThawed();
@@ -170,6 +184,7 @@ protected:
 	void launchMaze136Robot();
 	void launchMaze184Robot();
 	void timerExpired(const uint32);
+	void showRobotAtReactor();
 	void spotCompleted();
 
 	void doCanyonChase(void);
@@ -178,13 +193,18 @@ protected:
 	void throwAwayMarsShuttle();
 	void startUpFromFinishedSpaceChase();
 	void startUpFromSpaceChase();
-	void transportToRobotShip();
+	void transportOutFromSpaceChase(bool);
 	void spaceChaseClick(const Input &, const HotSpotID);
 	void updateCursor(const Common::Point, const Hotspot *);
+	void playSpaceAmbient();
 
 	Common::String getSoundSpotsName();
 	Common::String getNavMovieName();
 
+	Movie _extraMovie;
+	NotificationCallBack _extraMovieCallBack;
+
+	Movie _podSteerMovie;
 	InventoryItem *_attackingItem;
 	FuseFunction _bombFuse;
 	FuseFunction _noAirFuse;
@@ -202,6 +222,8 @@ protected:
 	Picture _shuttleInterface3;
 	Picture _shuttleInterface4;
 	Movie _canyonChaseMovie;
+	Sound _musicLoop;
+	SoundFader _musicFader;
 
 	MarsTimerEvent _marsEvent;
 
diff --git a/engines/pegasus/neighborhood/mars/tunnelpod.cpp b/engines/pegasus/neighborhood/mars/tunnelpod.cpp
new file mode 100644
index 0000000..b96c427
--- /dev/null
+++ b/engines/pegasus/neighborhood/mars/tunnelpod.cpp
@@ -0,0 +1,367 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
+#include "pegasus/neighborhood/mars/tunnelpod.h"
+#include "pegasus/neighborhood/mars/mars.h"
+
+namespace Pegasus {
+
+// Segment start and end points.
+
+static const TimeValue kLaunchStart = 315754;
+static const TimeValue kLaunchEnd = 319392;
+
+static const TimeValue kBranch1MainStart = 0;
+static const TimeValue kBranch1MainEnd = 3600;
+static const TimeValue kBranch2MainStart = kBranch1MainEnd;
+static const TimeValue kBranch2MainEnd = 13200;
+static const TimeValue kBranch3MainStart = kBranch2MainEnd;
+static const TimeValue kBranch3MainEnd = 20400;
+static const TimeValue kFinishMainStart = kBranch3MainEnd;
+static const TimeValue kFinishMainEnd = 30640;
+
+static const TimeValue kBranch2AltStart = 0;
+static const TimeValue kBranch2AltEnd = 13200;
+static const TimeValue kBranch3AltStart = kBranch2AltEnd;
+static const TimeValue kBranch3AltEnd = 22800;
+static const TimeValue kFinishAltStart = kBranch3AltEnd;
+static const TimeValue kFinishAltEnd = 33640;
+
+// Tunnel state.
+
+enum {
+	kTunnelLaunch,
+	kTunnelBranch1Left,
+	kTunnelBranch2Left,
+	kTunnelBranch2Right,
+	kTunnelBranch3Left,
+	kTunnelBranch3Right,
+	kTunnelFinish
+};
+
+
+TunnelPod::TunnelPod(Neighborhood *handler) : ChaseInteraction(kMarsTunnelPodInteractionID, handler,
+						kMarsTunnelPodNotificationID, (PegasusEngine *)g_engine), _tunnelMainMovie(kNoDisplayElement),
+						_tunnelAltMovie(kNoDisplayElement), _deathMovie(kNoDisplayElement) {
+	_currentMovie = NULL;
+	_currentCallBack = NULL;
+}
+
+void TunnelPod::openInteraction() {
+	((Mars *)_owner)->_navMovie.stop();
+
+	_tunnelCallBack.setNotification(&_chaseNotification);
+	_tunnelCallBack.initCallBack(&((Mars *)_owner)->_navMovie, kCallBackAtExtremes);
+	_tunnelCallBack.setCallBackFlag(kChaseEnteredBranchZone);
+	_tunnelCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_tunnelMainMovie.initFromMovieFile("Images/Mars/Pod 2345M.mov");
+	_tunnelMainMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_tunnelMainMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+	_tunnelMainMovie.setDisplayOrder(kNavMovieOrder);
+
+	_tunnelMainCallBack.setNotification(&_chaseNotification);
+	_tunnelMainCallBack.initCallBack(&_tunnelMainMovie, kCallBackAtExtremes);
+	_tunnelMainCallBack.setCallBackFlag(kChaseEnteredBranchZone);
+	_tunnelMainCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);	
+
+	_tunnelAltMovie.initFromMovieFile("Images/Mars/Pod 345A.mov");
+	_tunnelAltMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_tunnelAltMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+	_tunnelAltMovie.setDisplayOrder(kNavMovieOrder);
+
+	_tunnelAltCallBack.setNotification(&_chaseNotification);
+	_tunnelAltCallBack.initCallBack(&_tunnelAltMovie, kCallBackAtExtremes);
+	_tunnelAltCallBack.setCallBackFlag(kChaseEnteredBranchZone);
+	_tunnelAltCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	_deathMovie.initFromMovieFile("Images/Mars/Pod 2D.mov");
+	_deathMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_deathMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+	_deathMovie.setDisplayOrder(kNavMovieOrder);
+
+	_deathCallBack.setNotification(&_chaseNotification);
+	_deathCallBack.initCallBack(&_deathMovie, kCallBackAtExtremes);
+	_deathCallBack.setCallBackFlag(kChaseFinished);
+	_deathCallBack.scheduleCallBack(kTriggerAtStop, 0 ,0);
+
+	ChaseInteraction::openInteraction();
+
+	_steerPict.setDisplayOrder(kNavMovieOrder + 1);
+	_steerPict.moveElementTo(kPodSteerLeft, kPodSteerTop);
+}
+
+void TunnelPod::initInteraction() {
+	_steerPict.startDisplaying();
+
+	_tunnelState = kTunnelLaunch;
+	((Mars *)_owner)->_navMovie.setSegment(kLaunchStart, kLaunchEnd - kDecisionTime);
+	((Mars *)_owner)->_navMovie.setTime(kLaunchStart);
+	((Mars *)_owner)->_navMovie.start();
+	_currentMovie = &((Mars *)_owner)->_navMovie;
+	_currentCallBack = &_tunnelCallBack;
+	ChaseInteraction::initInteraction();
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB27", kArthurMarsTurnedOnTransport);
+}
+
+void TunnelPod::closeInteraction() {
+	((Mars *)_owner)->_navMovie.stop();
+	if (_tunnelState == kTunnelFinish) {
+	// Only bring nack the nav movie if we successfully finished the chase
+		((Mars *)_owner)->_navMovie.startDisplaying();
+		((Mars *)_owner)->_navMovie.show();
+	}
+	_tunnelCallBack.releaseCallBack();
+
+	_tunnelAltMovie.stop();
+	_tunnelAltMovie.stopDisplaying();
+	_tunnelAltMovie.releaseMovie();
+	_tunnelAltCallBack.releaseCallBack();
+
+	_deathMovie.stop();
+	_deathMovie.stopDisplaying();
+	_deathMovie.releaseMovie();
+	_deathCallBack.releaseCallBack();
+
+	ChaseInteraction::closeInteraction();
+}
+
+void TunnelPod::receiveNotification(Notification *notification, const NotificationFlags flags) {
+	if (notification == &_chaseNotification && flags == kChaseFinished) {
+		if (_tunnelState != kTunnelFinish) {
+			// We died
+			((Mars *)_owner)->die(kDeathCollidedWithPod);
+		} else {
+			((Mars *)_owner)->startUpFromFinishedTunnelPod();
+		}
+	}
+	ChaseInteraction::receiveNotification(notification, flags);
+}
+
+void TunnelPod::setUpBranch() {
+	TimeValue branchStart, branchEnd;
+
+	branchStart = 0;
+	branchEnd = 0;
+	switch (_tunnelState) {
+	case kTunnelLaunch:
+		branchStart = kLaunchEnd - kDecisionTime;
+		branchEnd = kLaunchEnd;
+		break;
+	case kTunnelBranch1Left:
+		branchStart = kBranch1MainEnd - kDecisionTime;
+		branchEnd = kBranch1MainEnd;
+		break;
+	case kTunnelBranch2Left:
+		branchStart = kBranch2AltEnd - kDecisionTime;
+		branchEnd = kBranch2AltEnd;
+		break;
+	case kTunnelBranch2Right:
+		branchStart = kBranch2MainEnd - kDecisionTime;
+		branchEnd = kBranch2MainEnd;
+		break;
+	case kTunnelBranch3Left:
+		branchStart = kBranch3MainEnd - kDecisionTime;
+		branchEnd = kBranch3MainEnd;
+		break;
+	case kTunnelBranch3Right:
+		branchStart = kBranch3AltEnd - kDecisionTime;
+		branchEnd = kBranch3AltEnd;
+		break;
+	default:
+		break;
+	}
+
+	_currentMovie->setSegment(branchStart, branchEnd);
+
+	_currentCallBack->setCallBackFlag(kChaseExitedBranchZone);
+	_currentCallBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void TunnelPod::branchLeft() {
+	TimeValue branchStart, branchEnd;
+	NotificationFlags flag;
+	Movie *movie;
+	NotificationCallBack *callBack;
+
+	branchStart = 0;
+	branchEnd = 0;
+	flag = 0;
+	movie = NULL;
+	callBack = NULL;
+	switch (_tunnelState) {
+	case kTunnelLaunch:
+		branchStart = kBranch1MainStart;
+		branchEnd = kBranch1MainEnd - kDecisionTime;
+		_tunnelState = kTunnelBranch1Left;
+		flag = kChaseEnteredBranchZone;
+		movie = &_tunnelMainMovie;
+		callBack = &_tunnelMainCallBack;
+		break;
+	case kTunnelBranch1Left:
+		branchStart = kBranch2AltStart;
+		branchEnd = kBranch2AltEnd - kDecisionTime;
+		_tunnelState = kTunnelBranch2Left;
+		flag = kChaseEnteredBranchZone;
+		movie = &_tunnelAltMovie;
+		callBack = &_tunnelAltCallBack;
+		break;
+	case kTunnelBranch2Left:
+	case kTunnelBranch2Right:
+		branchStart = kBranch3MainStart;
+		branchEnd = kBranch3MainEnd - kDecisionTime;
+		_tunnelState = kTunnelBranch3Left;
+		flag = kChaseEnteredBranchZone;
+		movie = &_tunnelMainMovie;
+		callBack = &_tunnelMainCallBack;
+		break;
+	case kTunnelBranch3Left:
+	case kTunnelBranch3Right:
+		branchStart = kFinishAltStart;
+		branchEnd = kFinishAltEnd;
+		_tunnelState = kTunnelFinish;
+		flag = kChaseFinished;
+		movie = &_tunnelAltMovie;
+		callBack = &_tunnelAltCallBack;
+		break;
+	default:
+		break;
+	}
+
+	movie->setSegment(branchStart, branchEnd);
+	movie->setTime(branchStart);
+
+	switchTo(*movie, *callBack);
+
+	callBack->setCallBackFlag(flag);
+	callBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void TunnelPod::branchRight() {
+	TimeValue branchStart, branchEnd;
+	NotificationFlags flag;
+	Movie *movie;
+	NotificationCallBack *callBack;
+
+	branchStart = 0;
+	branchEnd = 0;
+	flag = 0;
+	movie = NULL;
+	callBack = NULL;
+	switch (_tunnelState) {
+	case kTunnelLaunch:
+		switchTo(_deathMovie, _deathCallBack);
+		return;
+	case kTunnelBranch1Left:
+		branchStart = kBranch2MainStart;
+		branchEnd = kBranch2MainEnd - kDecisionTime;
+		_tunnelState = kTunnelBranch2Right;
+		flag = kChaseEnteredBranchZone;
+		movie = &_tunnelMainMovie;
+		callBack = &_tunnelMainCallBack;
+		break;
+	case kTunnelBranch2Left:
+	case kTunnelBranch2Right:
+		branchStart = kBranch3AltStart;
+		branchEnd = kBranch3AltEnd - kDecisionTime;
+		_tunnelState = kTunnelBranch3Right;
+		flag = kChaseEnteredBranchZone;
+		movie = &_tunnelAltMovie;
+		callBack = &_tunnelAltCallBack;
+		break;
+	case kTunnelBranch3Left:
+	case kTunnelBranch3Right:
+		branchStart = kFinishMainStart;
+		branchEnd = kFinishMainEnd;
+		_tunnelState = kTunnelFinish;
+		flag = kChaseFinished;
+		movie = &_tunnelMainMovie;
+		callBack = &_tunnelMainCallBack;
+		break;
+	default:
+		break;
+	}
+
+	movie->setSegment(branchStart, branchEnd);
+	movie->setTime(branchStart);
+
+	switchTo(*movie, *callBack);
+
+	callBack->setCallBackFlag(flag);
+	callBack->scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void TunnelPod::dontBranch() {
+	switch (_tunnelState) {
+	case kTunnelLaunch:
+	case kTunnelBranch1Left:
+		if (_currentMovie == &_tunnelAltMovie)
+			branchLeft();
+		else
+			branchRight();
+		break;
+	case kTunnelBranch2Left:
+	case kTunnelBranch2Right:
+		if (_currentMovie == &_tunnelAltMovie)
+			branchRight();
+		else
+			branchLeft();
+		break;
+	case kTunnelBranch3Left:
+	case kTunnelBranch3Right:
+		if (_currentMovie == &_tunnelAltMovie)
+			branchLeft();
+		else
+			branchRight();
+		break;
+	default:
+		break;
+	}
+}
+
+void TunnelPod::switchTo(Movie &movie, NotificationCallBack &callBack) {
+	if (_currentMovie != &movie) {
+		if (_currentMovie != NULL) {
+			_currentMovie->stop();
+			_currentMovie->hide();
+			_currentMovie->stopDisplaying();
+		}
+
+		_currentMovie = &movie;
+
+		_currentMovie->startDisplaying();
+		_currentMovie->show();
+		_currentMovie->start();
+	}
+
+	if (_currentCallBack != &callBack) {
+		_currentCallBack = &callBack;
+	}
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/mars/tunnelpod.h b/engines/pegasus/neighborhood/mars/tunnelpod.h
new file mode 100644
index 0000000..12b2dd9
--- /dev/null
+++ b/engines/pegasus/neighborhood/mars/tunnelpod.h
@@ -0,0 +1,74 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PEGASUS_NEIGHBORHOOD_MARS_TUNNELPOD_H
+#define PEGASUS_NEIGHBORHOOD_MARS_TUNNELPOD_H
+
+#include "pegasus/chase.h"
+#include "pegasus/movie.h"
+
+namespace Pegasus {
+
+class Mars;
+
+class TunnelPod : public ChaseInteraction {
+friend class Mars;
+friend struct MusicTimerEvent;
+public:
+
+	TunnelPod(Neighborhood *);
+	virtual ~TunnelPod() {}
+
+protected:
+
+	void openInteraction();
+	void initInteraction();
+	void closeInteraction();
+
+	void receiveNotification(Notification *, const NotificationFlags);
+
+	void setUpBranch();
+	void branchLeft();
+	void branchRight();
+	void dontBranch();
+
+	void switchTo(Movie &, NotificationCallBack &);
+
+	Movie _tunnelMainMovie;
+	Movie _tunnelAltMovie;
+	Movie _deathMovie;
+	NotificationCallBack _tunnelCallBack;
+	NotificationCallBack _tunnelMainCallBack;
+	NotificationCallBack _tunnelAltCallBack;
+	NotificationCallBack _deathCallBack;
+
+	Movie *_currentMovie;
+	NotificationCallBack *_currentCallBack;
+	short _tunnelState;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp
index 3116bd7..d7e25a1 100644
--- a/engines/pegasus/neighborhood/neighborhood.cpp
+++ b/engines/pegasus/neighborhood/neighborhood.cpp
@@ -36,6 +36,7 @@
 #include "pegasus/interface.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/mapchip.h"
 #include "pegasus/neighborhood/neighborhood.h"
 #include "pegasus/neighborhood/tsa/fulltsa.h"
@@ -719,7 +720,15 @@ void Neighborhood::cantMoveThatWay(CanMoveForwardReason reason) {
 }
 
 void Neighborhood::cantOpenDoor(CanOpenDoorReason) {
+	bool firstLockedDoor;
+
 	bumpIntoWall();
+	if (g_arthurChip) {
+		firstLockedDoor = g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA31", kArthurAttemptedLockedDoor);
+
+		if (!firstLockedDoor)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA32", kArthurAttemptedLockedDoorAgain);
+	}
 }
 
 void Neighborhood::turnTo(const DirectionConstant direction) {
@@ -1004,9 +1013,9 @@ void Neighborhood::startExitMovie(const ExitTable::Entry &exitEntry) {
 	GameState.setNextDirection(exitEntry.exitDirection);
 
 	if (exitEntry.movieEnd == exitEntry.exitEnd) // Just a walk.
-		startMovieSequence(exitEntry.movieStart, exitEntry.movieEnd, kMoveForwardCompletedFlag, kFilterNoInput, false);
+		startMovieSequence(exitEntry.movieStart, exitEntry.movieEnd, kMoveForwardCompletedFlag, false, kFilterNoInput);
 	else // We're stridin'!
-		startMovieSequence(exitEntry.movieStart, exitEntry.exitEnd, kStrideCompletedFlag, kFilterNoInput, false, exitEntry.movieEnd);
+		startMovieSequence(exitEntry.movieStart, exitEntry.exitEnd, kStrideCompletedFlag, false, kFilterNoInput, exitEntry.movieEnd);
 
 	if (g_compass)
 		g_compass->startFader(compassMove);
@@ -1021,14 +1030,14 @@ void Neighborhood::startZoomMovie(const ZoomTable::Entry &zoomEntry) {
 	GameState.setNextRoom(zoomEntry.room);
 	GameState.setNextDirection(zoomEntry.direction);
 
-	startMovieSequence(zoomEntry.movieStart, zoomEntry.movieEnd, kMoveForwardCompletedFlag, kFilterNoInput, false);
+	startMovieSequence(zoomEntry.movieStart, zoomEntry.movieEnd, kMoveForwardCompletedFlag, false, kFilterNoInput);
 
 	if (g_compass)
 		g_compass->startFader(compassMove);
 }
 
 void Neighborhood::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) {
-	startMovieSequence(startTime, stopTime, kDoorOpenCompletedFlag, kFilterNoInput, false);
+	startMovieSequence(startTime, stopTime, kDoorOpenCompletedFlag, false, kFilterNoInput);
 }
 
 void Neighborhood::startTurnPush(const TurnDirection turnDirection, const TimeValue newView, const DirectionConstant nextDir) {
@@ -1186,7 +1195,7 @@ void Neighborhood::activateOneHotspot(HotspotInfoTable::Entry &entry, Hotspot *h
 
 void Neighborhood::startSpotOnceOnly(TimeValue startTime, TimeValue stopTime) {
 	_turnPush.hide();
-	startMovieSequence(startTime, stopTime, kSpotCompletedFlag, kFilterNoInput, false);
+	startMovieSequence(startTime, stopTime, kSpotCompletedFlag, false, kFilterNoInput);
 }
 
 void Neighborhood::startMovieSequence(const TimeValue startTime, const TimeValue stopTime, NotificationFlags flags, bool loopSequence,
@@ -1550,7 +1559,7 @@ void Neighborhood::startExtraLongSequence(const uint32 firstExtra, const uint32
 		getExtraEntry(lastExtra, lastEntry);
 		_lastExtra = firstExtra;
 		_turnPush.hide();
-		startMovieSequence(firstEntry.movieStart, lastEntry.movieEnd, flags, kFilterNoInput, interruptionFilter);
+		startMovieSequence(firstEntry.movieStart, lastEntry.movieEnd, flags, false, interruptionFilter);
 	}
 }
 
@@ -1647,7 +1656,11 @@ void Neighborhood::handleInput(const Input &input, const Hotspot *cursorSpot) {
 		else if (input.rightButtonAnyDown())
 			rightButton(input);
 	}
-
+	if (_vm->toggleRequested()) {
+		_vm->requestToggle(false);
+		if (g_AIArea)
+			g_AIArea->setChattyAI(!g_AIArea->isChattyAI());
+	}
 	InputHandler::handleInput(input, cursorSpot);
 }
 
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h
index 3c1c5ea..308f608 100644
--- a/engines/pegasus/neighborhood/neighborhood.h
+++ b/engines/pegasus/neighborhood/neighborhood.h
@@ -93,6 +93,8 @@ bool operator!=(const QueueRequest &arg1, const QueueRequest &arg2);
 
 class GameInteraction;
 class Item;
+class SubChase;
+class SubPlatform;
 class Neighborhood;
 
 class StriderCallBack : public TimeBaseCallBack {
@@ -110,6 +112,8 @@ typedef Common::Queue<QueueRequest> NeighborhoodActionQueue;
 
 class Neighborhood : public IDObject, public NotificationReceiver, public InputHandler, public Idler {
 friend class StriderCallBack;
+friend class SubChase;
+friend class SubPlatform;
 
 public:
 	Neighborhood(InputHandler *nextHandler, PegasusEngine *vm, const Common::String &resName, NeighborhoodID id);
@@ -290,7 +294,7 @@ protected:
 
 	virtual void createNeighborhoodSpots();
 
-	void resetLastExtra() { _lastExtra = -1; }
+	void resetLastExtra() { _lastExtra = 0xffffffff; }
 
 	virtual void throwAwayInterface();
 
@@ -352,7 +356,7 @@ protected:
 	AlternateID _currentAlternate;
 	HotSpotActivationID _currentActivation;
 
-	int32 _lastExtra;
+	ExtraID _lastExtra;
 	DeathReason _extraDeathReason;
 
 	// Graphics
diff --git a/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp b/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp
index e2a0267..d15fe33 100644
--- a/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp
+++ b/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp
@@ -24,6 +24,7 @@
  */
 
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/norad.h"
 #include "pegasus/neighborhood/norad/alpha/ecrmonitor.h"
@@ -214,6 +215,9 @@ void NoradAlphaECRMonitor::closeInteraction() {
 	_ecrPan.stopDisplaying();
 	_ecrPan.releasePanorama();
 	_ecrPanCallBack.releaseCallBack();
+
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB33", kArthurNoradAtSecurityMonitor);
 }
 
 } // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp b/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp
index 3491f16..ff5f2d7 100644
--- a/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp
+++ b/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp
@@ -25,6 +25,7 @@
 
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/inventory/airmask.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/alpha/fillingstation.h"
@@ -192,6 +193,8 @@ void NoradAlphaFillingStation::splashFinished() {
 
 void NoradAlphaFillingStation::intakeWarningFinished() {
 	setStaticState(kFSMainMenu, kMainMenu);
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurNoradSawIntakeWarning);
 }
 
 void NoradAlphaFillingStation::showIntakeInProgress(uint16 numSeconds) {
diff --git a/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp b/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp
index 6a24113..744dff4 100644
--- a/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp
+++ b/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp
@@ -23,19 +23,27 @@
  *
  */
 
+#include "pegasus/cursor.h"
 #include "pegasus/energymonitor.h"
 #include "pegasus/gamestate.h"
+#include "pegasus/interface.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/inventory/airmask.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/subcontrolroom.h"
 #include "pegasus/neighborhood/norad/alpha/ecrmonitor.h"
 #include "pegasus/neighborhood/norad/alpha/fillingstation.h"
 #include "pegasus/neighborhood/norad/alpha/noradalpha.h"
+#include "pegasus/neighborhood/norad/alpha/subchase.h"
 
 namespace Pegasus {
 
+static const ExtraID kShowThermalScan = 1000;
+
+static const HotSpotID kThermalScanHotSpotID = 10000;
+
 const uint32 NoradAlpha::_noradAlphaClawExtras[22] = {
 	kN22ClawFromAToB,
 	kN22ClawALoop,
@@ -61,7 +69,9 @@ const uint32 NoradAlpha::_noradAlphaClawExtras[22] = {
 	kN22ClawDClockwise
 };
 
-NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad(nextHandler, owner, "Norad Alpha", kNoradAlphaID) {
+NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner)
+	: Norad(nextHandler, owner, "Norad Alpha", kNoradAlphaID),
+	_thermalScanSpot(kThermalScanHotSpotID), _extraMovie(kNoDisplayElement) {
 	_elevatorUpRoomID = kNorad11South;
 	_elevatorDownRoomID = kNorad12South;
 	_elevatorUpSpotID = kNorad12ElevatorUpSpotID;
@@ -82,10 +92,10 @@ NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad(
 	_lowerPressureDoorDownSpotID = kAlphaLowerPressureDoorDownSpotID;
 	_lowerPressureDoorAbortSpotID = kNorad21WestOutSpotID;
 
-	_pressureSoundIn = kPressureDoorIntro1In;
-	_pressureSoundOut = kPressureDoorIntro1Out;
-	_equalizeSoundIn = kPressureDoorIntro2In;
-	_equalizeSoundOut = kPressureDoorIntro2Out;
+	_pressureSoundIn = kAlphaPressureDoorIntro1In;
+	_pressureSoundOut = kAlphaPressureDoorIntro1Out;
+	_equalizeSoundIn = kAlphaPressureDoorIntro2In;
+	_equalizeSoundOut = kAlphaPressureDoorIntro2Out;
 	_accessDeniedIn = kAlphaAccessDeniedIn;
 	_accessDeniedOut = kAlphaAccessDeniedOut;
 
@@ -97,9 +107,22 @@ NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad(
 	setIsItemTaken(kGasCanister);
 }
 
+NoradAlpha::~NoradAlpha() {
+	if (_vm->isDVD())
+		_vm->getAllHotspots().remove(&_thermalScanSpot);
+}
+
 void NoradAlpha::init() {
 	Norad::init();
 
+	_extraMovieCallBack.setNotification(&_neighborhoodNotification);
+
+	if (_vm->isDVD()) {
+		_thermalScanSpot.setArea(Common::Rect(216, 112, 336, 312));
+		_thermalScanSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag);
+		_vm->getAllHotspots().push_back(&_thermalScanSpot);
+	}
+	
 	Hotspot *hotspot = _vm->getAllHotspots().findHotspotByID(kN01GasCanisterSpotID);
 	hotspot->setMaskedHotspotFlags(kPickUpItemSpotFlag, kPickUpItemSpotFlag);
 	HotspotInfoTable::Entry *hotspotEntry = findHotspotEntry(kN01GasCanisterSpotID);
@@ -208,7 +231,7 @@ void NoradAlpha::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSp
 }
 
 void NoradAlpha::playClawMonitorIntro() {
-	playSpotSoundSync(kLoadClawIntroIn, kLoadClawIntroOut);
+	playSpotSoundSync(kAlphaLoadClawIntroIn, kAlphaLoadClawIntroOut);
 }
 
 GameInteraction *NoradAlpha::makeInteraction(const InteractionID interactionID) {
@@ -217,6 +240,8 @@ GameInteraction *NoradAlpha::makeInteraction(const InteractionID interactionID)
 		return new NoradAlphaECRMonitor(this);
 	case kNoradFillingStationInteractionID:
 		return new NoradAlphaFillingStation(this);
+	case kNoradSubChaseInteractionID:
+		return new SubChase(this);
 	}
 
 	return Norad::makeInteraction(interactionID);
@@ -247,17 +272,27 @@ void NoradAlpha::loadAmbientLoops() {
 				play unmanned loop
 */
 
-	if (!GameState.getNoradSeenTimeStream())
+	if (!GameState.getNoradSeenTimeStream() || !g_interface || _vm->getEnergyDeathReason() == kDeathSubDestroyed)
 		return;
 
 	RoomID room = GameState.getCurrentRoom();
 	if (GameState.getNoradGassed()) {
-		if (room >= kNorad11 && room <= kNorad19West)
-			loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3);
-		else if (room >= kNorad21 && room <= kNorad22West)
-			loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3);
-		else
-			loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume);
+		if (room >= kNorad11 && room <= kNorad19West) {
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", kNoradWarningVolume * 3);
+			else
+				loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3);
+		} else if (room >= kNorad21 && room <= kNorad22West) {
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.32K.AIFF", kNoradWarningVolume * 3);
+			else
+				loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3);
+		} else {
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/Norad/WARNING LOOP.32K.AIFF", kNoradWarningVolume);
+			else
+				loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume);
+		}
 	} else {
 		loadLoopSound1("");
 	}
@@ -317,8 +352,14 @@ void NoradAlpha::arriveAt(const RoomID room, const DirectionConstant direction)
 	case kNorad04:
 		arriveAtNorad04();
 		break;
+	case kNorad07:
+		if (_vm->isDVD() && GameState.getLastRoom() == kNorad06)
+			startExtraSequence(kShowThermalScan, kExtraCompletedFlag, kFilterNoInput);
+		break;
 	case kNorad07North:
 		GameState.setScoringSawUnconsciousOperator(true);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA70", kArthurNoradSawUnconsciousOperator);
 		break;
 	case kNorad11:
 		GameState.setScoringWentThroughPressureDoor(true);
@@ -330,11 +371,30 @@ void NoradAlpha::arriveAt(const RoomID room, const DirectionConstant direction)
 }
 
 void NoradAlpha::arriveAtNorad01() {
-	if (!GameState.getNoradSeenTimeStream() && GameState.getCurrentDirection() == kSouth) {
-		GameState.setNoradN22MessagePlayed(false);
-		requestExtraSequence(kNoradArriveFromTSA, kExtraCompletedFlag, kFilterNoInput);
-		// You are no match for me, human.
-		requestExtraSequence(kNorad01RobotTaunt, kExtraCompletedFlag, kFilterNoInput);
+	Item *argonCanister, *nitrogenCanister;
+
+	switch (GameState.getCurrentDirection()) {
+	case kSouth:
+		if (!GameState.getNoradSeenTimeStream()) {
+			GameState.setNoradN22MessagePlayed(false);
+			requestExtraSequence(kNoradArriveFromTSA, kExtraCompletedFlag, kFilterNoInput);
+			// You are no match for me, human.
+			requestExtraSequence(kNorad01RobotTaunt, kExtraCompletedFlag, kFilterNoInput);
+		}
+		break;
+	case kEast:
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurNoradAtSecurityMonitor);
+		break;
+	case kWest:
+		if (GameState.getLastRoom() == kNorad01West) {
+			argonCanister = g_allItems.findItemByID(kArgonCanister);
+			nitrogenCanister = g_allItems.findItemByID(kNitrogenCanister);
+			if (((GameState.isTakenItemID(kArgonCanister) && argonCanister->getItemState() != kArgonFull) ||
+				(GameState.isTakenItemID(kNitrogenCanister) && nitrogenCanister->getItemState() != kNitrogenFull)) && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurNoradDidntFillCanisters);
+		}			
+		break;
 	}
 }
 
@@ -359,20 +419,103 @@ void NoradAlpha::arriveAtNorad22() {
 	}
 }
 
+void NoradAlpha::turnTo(const DirectionConstant direction) {
+	Norad::turnTo(direction);
+	if (GameState.getCurrentRoomAndView() == MakeRoomView(kNorad01, kEast) && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurNoradAtSecurityMonitor);
+}
+
 void NoradAlpha::bumpIntoWall() {
 	requestSpotSound(kAlphaBumpIntoWallIn, kAlphaBumpIntoWallOut, kFilterNoInput, 0);
 	Neighborhood::bumpIntoWall();
 }
 
+void NoradAlpha::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
+	TimeValue segmentStart = 0, segmentStop = 0;
+	bool loopSequence = false;
+	Common::Rect pushBounds;
+	NotificationFlags extraFlags;
+
+	switch (extraID) {
+	case kShowThermalScan:
+		_turnPush.getBounds(pushBounds);
+		
+		switch (extraID) {
+		case kShowThermalScan:
+			_extraMovie.initFromMovieFile("Images/Norad Alpha/N07NS.movie");
+			segmentStart = 0;
+			segmentStop = _extraMovie.getDuration();
+			loopSequence = false;
+			break;
+		default:
+			break;
+		}
+		
+		_lastExtra = extraID;
+		_turnPush.hide();
+		
+		if (!loopSequence && g_AIArea)
+			g_AIArea->lockAIOut();
+		
+		extraFlags = flags;
+		_interruptionFilter = interruptionFilter;
+		// Stop the nav movie before doing anything else
+		_navMovie.stop();
+		_navMovie.stopDisplaying();
+		
+		_extraMovie.setVolume(_vm->getSoundFXLevel());
+		_extraMovie.moveElementTo(pushBounds.left, pushBounds.top);
+		_extraMovie.setDisplayOrder(kNavMovieOrder + 1);
+		_extraMovie.startDisplaying();
+		_extraMovie.show();
+		_extraMovie.setFlags(0);
+		_extraMovie.setSegment(segmentStart, segmentStop);
+		_extraMovie.setTime(segmentStart);
+		if (loopSequence)
+			_extraMovie.setFlags(kLoopTimeBase);
+		else
+			extraFlags |= kNeighborhoodMovieCompletedFlag;
+		_extraMovieCallBack.cancelCallBack();
+		_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
+		if (extraFlags != 0) {
+			_extraMovieCallBack.setCallBackFlag(extraFlags);
+			_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		}
+		_extraMovie.start();
+		break;
+	default:
+		Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+		break;
+	}
+}
+
 void NoradAlpha::receiveNotification(Notification *notification, const NotificationFlags flags) {
 	if ((flags & kExtraCompletedFlag) != 0) {
 		switch (_lastExtra) {
+		case kShowThermalScan:
+			_interruptionFilter = kFilterAllInput;
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			break;
+		case kNorad19ExitToSub:
+			if (_vm->isDVD()) {
+				_interruptionFilter = kFilterAllInput;
+				_vm->_cursor->hide();
+				setNextHandler(_vm);
+				throwAwayInterface();
+				loadLoopSound1("");
+				newInteraction(kNoradSubChaseInteractionID);
+				GameState.setScoringEnteredSub(true);
+			}
+			break;
 		case kNoradArriveFromTSA:
 			GameState.setNoradSeenTimeStream(true);
 			loadAmbientLoops();
 			break;
 		case kNorad01RobotTaunt:
-			g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN01SB", false, kWarningInterruption);
+			if (g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN01SB", false, kWarningInterruption);
 			_interruptionFilter = kFilterAllInput;
 			makeContinuePoint();
 			break;
@@ -389,11 +532,38 @@ void NoradAlpha::receiveNotification(Notification *notification, const Notificat
 			startExtraSequence(kNorad22SouthFinish, kExtraCompletedFlag, kFilterNoInput);
 			break;
 		case kNorad22SouthFinish:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurNoradSawSubMessage);
 			_interruptionFilter = kFilterAllInput;
 			// Force ArriveAt to do its thing...
 			GameState.setCurrentRoom(kNorad21);
 			arriveAt(kNorad22, kSouth);
 			break;
+		case kN22ClawFromAToB:
+		case kN22ClawAPinch:
+		case kN22ClawACounterclockwise:
+		case kN22ClawAClockwise:
+		case kN22ClawFromBToA:
+		case kN22ClawFromBToC:
+		case kN22ClawFromBToD:
+		case kN22ClawBPinch:
+		case kN22ClawBCounterclockwise:
+		case kN22ClawBClockwise:
+		case kN22ClawFromCToB:
+		case kN22ClawCPinch:
+		case kN22ClawCCounterclockwise:
+		case kN22ClawCClockwise:
+		case kN22ClawFromDToB:
+		case kN22ClawDPinch:
+		case kN22ClawDCounterclockwise:
+		case kN22ClawDClockwise:
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA64", kArthurNoradPlayedWithClaw);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA66", kArthurNoradPlayedWithClaw);
+			}
+			break;
 		}
 	}
 
@@ -490,10 +660,23 @@ TimeValue NoradAlpha::getViewTime(const RoomID room, const DirectionConstant dir
 	return Norad::getViewTime(room, direction);
 }
 
+void NoradAlpha::setSoundFXLevel(const uint16 level) {
+	SubChase *chase;
+
+	Neighborhood::setSoundFXLevel(level);
+	if (_currentInteraction != NULL && GameState.getScoringEnteredSub()) {
+		chase = (SubChase *)_currentInteraction;
+		if (chase->_subMovie.isMovieValid())
+			chase->_subMovie.setVolume(level);
+	}
+}
+
 void NoradAlpha::turnOnFillingStation() {
 	if (GameState.getCurrentRoom() == kNorad01West && !GameState.getNoradFillingStationOn()) {
 		GameState.setNoradFillingStationOn(true);
 		updateViewFrame();
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA72", kArthurNoradSawFillingStation);
 	}
 }
 
@@ -545,6 +728,10 @@ void NoradAlpha::activateHotspots() {
 			}
 		}
 		break;
+	case MakeRoomView(kNorad07, kNorth):
+		if (_vm->isDVD())
+			_vm->getAllHotspots().activateOneHotspot(kThermalScanHotSpotID);
+		break;
 	case MakeRoomView(kNorad10, kEast):
 		if (GameState.isCurrentDoorOpen())
 			_vm->getAllHotspots().deactivateOneHotspot(kNorad10DoorSpotID);
@@ -568,6 +755,9 @@ void NoradAlpha::clickInHotspot(const Input &input, const Hotspot *cursorSpot) {
 				hotspotEntry->hotspotItem = item->getObjectID();
 			}
 		}
+	} else if (GameState.getCurrentRoomAndView() == MakeRoomView(kNorad07, kNorth) &&
+				cursorSpot->getObjectID() == kThermalScanHotSpotID) {
+		startExtraSequence(kShowThermalScan, kExtraCompletedFlag, kFilterNoInput);
 	}
 }
 
diff --git a/engines/pegasus/neighborhood/norad/alpha/noradalpha.h b/engines/pegasus/neighborhood/norad/alpha/noradalpha.h
index 582d6c2..ef209d3 100644
--- a/engines/pegasus/neighborhood/norad/alpha/noradalpha.h
+++ b/engines/pegasus/neighborhood/norad/alpha/noradalpha.h
@@ -31,11 +31,13 @@
 namespace Pegasus {
 
 class Item;
+class SubChase;
 
 class NoradAlpha : public Norad {
+friend class SubChase;
 public:
 	NoradAlpha(InputHandler *, PegasusEngine *);
-	virtual ~NoradAlpha() {}
+	virtual ~NoradAlpha();
 
 	virtual void init();
 	void start();
@@ -77,6 +79,8 @@ public:
 
 	void checkContinuePoint(const RoomID, const DirectionConstant);
 
+	void setSoundFXLevel(const uint16);
+
 	bool canSolve();
 	void doSolve();
 
@@ -90,6 +94,9 @@ protected:
 	virtual void arriveAtNorad22();
 
 	virtual void arriveAt(const RoomID, const DirectionConstant);
+	virtual void turnTo(const DirectionConstant);
+
+	virtual void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits);
 
 	virtual void getZoomEntry(const HotSpotID, ZoomTable::Entry &);
 	virtual TimeValue getViewTime(const RoomID, const DirectionConstant);
@@ -102,6 +109,11 @@ protected:
 
 	void bumpIntoWall();
 
+	Hotspot _thermalScanSpot;
+
+	Movie _extraMovie;
+	NotificationCallBack _extraMovieCallBack;
+
 	Item *_fillingStationItem;
 
 	bool _subPrepFailed;
diff --git a/engines/pegasus/neighborhood/norad/alpha/subchase.cpp b/engines/pegasus/neighborhood/norad/alpha/subchase.cpp
new file mode 100644
index 0000000..861227d
--- /dev/null
+++ b/engines/pegasus/neighborhood/norad/alpha/subchase.cpp
@@ -0,0 +1,455 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "pegasus/pegasus.h"
+#include "pegasus/gamestate.h"
+#include "pegasus/neighborhood/norad/alpha/subchase.h"
+#include "pegasus/neighborhood/norad/alpha/noradalpha.h"
+#include "pegasus/neighborhood/norad/constants.h"
+
+namespace Pegasus {
+
+static const TimeScale kSubChaseScale = 600;
+
+static const DisplayOrder kSubChaseOrder = 27000;
+
+// Segment start and end points.
+
+static const TimeValue kIntroStart = 0;
+static const TimeValue kIntroEnd = 2400;
+static const TimeValue kDialogStart = kIntroEnd;
+static const TimeValue kDialogEnd = 20920;
+static const TimeValue kBranch1Start = kDialogEnd;
+static const TimeValue kBranch1End = 32120;
+static const TimeValue kBranch2LeftStart = kBranch1End;
+static const TimeValue kBranch2LeftEnd = 48080;
+static const TimeValue kBranch3Start = kBranch2LeftEnd;
+static const TimeValue kBranch3End = 61080;
+static const TimeValue kBranch4Start = kBranch3End;
+static const TimeValue kBranch4End = 84080;
+static const TimeValue kBranch5Start = kBranch4End;
+static const TimeValue kBranch5End = 94840;
+static const TimeValue kBranch6Start = kBranch5End;
+static const TimeValue kBranch6End = 106040;
+static const TimeValue kBranch7LeftStart = kBranch6End;
+static const TimeValue kBranch7LeftEnd = 118840;
+static const TimeValue kExitStart = kBranch7LeftEnd;
+static const TimeValue kExitEnd = 133200;
+static const TimeValue kBranch2RightStart = 133200;
+static const TimeValue kBranch2RightEnd = 149160;
+static const TimeValue kBranch7RightStart = 168000;
+static const TimeValue kBranch7RightEnd = 180800;
+
+// Death start and end points.
+
+static const TimeValue kDeath4Start = 149160;
+static const TimeValue kDeath4End = 158040;
+static const TimeValue kDeath5Start = kDeath4End;
+static const TimeValue kDeath5End = 163760;
+static const TimeValue kDeath6Start = kDeath5End;
+static const TimeValue kDeath6End = 168000;
+static const TimeValue kDeath7Start = 180800;
+static const TimeValue kDeath7End = 187040;
+
+// Chase state.
+
+enum {
+	kSubDialog,
+	kSubBranch1,
+	kSubBranch2Left,
+	kSubBranch2Right,
+	kSubBranch3,
+	kSubBranch4,
+	kSubBranch5,
+	kSubBranch6,
+	kSubBranch7Left,
+	kSubBranch7Right,
+	kSubExit
+};
+
+void HintTimerEvent::fire() {
+	subChase->hintTimerExpired(*this);
+}
+
+void BlinkTimerEvent::fire() {
+	subChase->blinkTimerExpired(*this);
+}
+
+SubChase::SubChase(Neighborhood *handler) : ChaseInteraction(kNoradSubChaseInteractionID, handler,
+						kNoradSubChaseNotificationID, (PegasusEngine *)g_engine), _subMovie(kNoDisplayElement),
+						_hintPict(kNoDisplayElement), _blinkPict(kNoDisplayElement), _canSteerSub(true) {
+}
+
+void SubChase::openInteraction() {
+	_subMovie.initFromMovieFile("Images/Norad Alpha/Sub Chase Movie");
+	_subMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+	_subMovie.moveElementTo(0, 0);
+	_subMovie.setDisplayOrder(kSubChaseOrder);
+	_subMovie.startDisplaying();
+	_subMovie.show();
+	
+	_subCallBack.setNotification(&_chaseNotification);
+	_subCallBack.initCallBack(&_subMovie, kCallBackAtExtremes);
+	
+	ChaseInteraction::openInteraction();
+	
+	_steerPict.setDisplayOrder(kSubChaseOrder + 1);
+	_steerPict.moveElementTo(kNoradSubSteerLeft, kNoradSubSteerTop);
+	
+	_hintPict.initFromPICTFile("Images/Norad Alpha/Sub Chase steerk1.pict", true);
+	_hintPict.setDisplayOrder(kSubChaseOrder + 1);
+	_hintPict.moveElementTo(kNoradSubHintLeft, kNoradSubHintTop);
+	_blinkPict.initFromPICTFile("Images/Norad Alpha/Sub Chase steerk0.pict", true);
+	_blinkPict.setDisplayOrder(kSubChaseOrder + 1);
+	_blinkPict.moveElementTo(kNoradSubHintLeft, kNoradSubHintTop);
+}
+
+void SubChase::initInteraction() {
+	_canSteerSub = !GameState.getWalkthroughMode();
+
+	_owner->playMovieSegment(&_subMovie, kIntroStart, kIntroEnd);
+
+	_subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	if (_canSteerSub) {
+		_steerPict.startDisplaying();
+		_hintPict.startDisplaying();
+		_blinkPict.startDisplaying();
+		startHintTimer(20000 - kDialogStart, kSubChaseScale, kStartedHint);
+		_subCallBack.setCallBackFlag(kChaseEnteredBranchZone);
+		_subMovie.setSegment(kDialogStart, kBranch1End - kDecisionTime);
+	} else {
+		_subCallBack.setCallBackFlag(kChaseFinished);
+		_subMovie.setSegment(kDialogStart, kExitEnd);
+	}
+
+	_subState = kSubDialog;
+	_subMovie.setTime(kDialogStart);
+	_subMovie.start();
+	
+	ChaseInteraction::initInteraction();
+}
+
+void SubChase::closeInteraction() {
+	_subMovie.stop();
+	_subMovie.stopDisplaying();
+	_subMovie.releaseMovie();
+	_subCallBack.releaseCallBack();
+	
+	_hintPict.hide();
+	_hintPict.deallocateSurface();
+	
+	_blinkPict.hide();
+	_blinkPict.deallocateSurface();
+	
+	ChaseInteraction::closeInteraction();
+}
+
+void SubChase::receiveNotification(Notification *notification, const NotificationFlags flags) {
+	if (notification == &_chaseNotification && flags == kChaseFinished) {
+		if (_subState != kSubDialog && _subState != kSubExit) {
+			// We died
+			((NoradAlpha *)_owner)->die(kDeathSubDestroyed);
+		} else {
+			_subMovie.stopDisplaying();
+			((PegasusEngine *)g_engine)->_gfx->enableErase();
+			((PegasusEngine *)g_engine)->_gfx->updateDisplay();
+			((PegasusEngine *)g_engine)->_gfx->disableErase();
+			((PegasusEngine *)g_engine)->jumpToNewEnvironment(kNoradDeltaID, kNorad41, kEast);
+		}
+	}
+	ChaseInteraction::receiveNotification(notification, flags);
+}
+
+void SubChase::handleInput(const Input &input, const Hotspot *cursorSpot) {
+	if (_subMovie.getTime() < kBranch1Start && input.anyInput()) {
+		if (_canSteerSub) {
+			if (!_blinkFuse.isFuseLit()) {
+				// If the hint is not blinking then it must not be running, so display it
+				_hintPict.show();
+				startBlinkTimer(10, 10, kEnteredBlinkState);
+			}
+			_subState = kSubBranch1;
+			startHintTimer(3000, kSubChaseScale, kEndedHint);
+		} else {
+			_subState = kSubExit;
+		}
+		_subMovie.setTime(kBranch1Start);
+	} else {
+		ChaseInteraction::handleInput(input, cursorSpot);
+	}
+}
+
+void SubChase::setUpBranch() {
+	TimeValue branchStart, branchEnd;
+	
+	branchStart = 0;
+	branchEnd = 0;
+	switch (_subState) {
+	case kSubDialog:
+	case kSubBranch1:
+		branchStart = kBranch1End - kDecisionTime;
+		branchEnd = kBranch1End;
+		break;
+	case kSubBranch2Left:
+		branchStart = kBranch2LeftEnd - kDecisionTime;
+		branchEnd = kBranch2LeftEnd;
+		break;
+	case kSubBranch2Right:
+		branchStart = kBranch2RightEnd - kDecisionTime;
+		branchEnd = kBranch2RightEnd;
+		break;
+	case kSubBranch3:
+		branchStart = kBranch3End - kDecisionTime;
+		branchEnd = kBranch3End;
+		break;
+	case kSubBranch4:
+		branchStart = kBranch4End - kDecisionTime;
+		branchEnd = kBranch4End;
+		break;
+	case kSubBranch5:
+		branchStart = kBranch5End - kDecisionTime;
+		branchEnd = kBranch5End;
+		break;
+	case kSubBranch6:
+		branchStart = kBranch6End - kDecisionTime;
+		branchEnd = kBranch6End;
+		break;
+	case kSubBranch7Left:
+		branchStart = kBranch7LeftEnd - kDecisionTime;
+		branchEnd = kBranch7LeftEnd;
+		break;
+	case kSubBranch7Right:
+		branchStart = kBranch7RightEnd - kDecisionTime;
+		branchEnd = kBranch7RightEnd;
+		break;
+	default:
+		break;
+	}
+	
+	_subMovie.setSegment(branchStart, branchEnd);
+	
+	_subCallBack.setCallBackFlag(kChaseExitedBranchZone);
+	_subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void SubChase::branchLeft() {
+	TimeValue branchStart, branchEnd;
+	NotificationFlags flag;
+	
+	branchStart = 0;
+	branchEnd = 0;
+	flag = 0;
+	switch (_subState) {
+	case kSubDialog:
+	case kSubBranch1:
+		branchStart = kBranch2LeftStart;
+		branchEnd = kBranch2LeftEnd;
+		// Don't show the controls hint when we approach the whale
+		// since the branch segments here are identical
+		flag = kChaseExitedBranchZone;
+		_subState = kSubBranch2Left;
+		break;
+	case kSubBranch2Left:
+	case kSubBranch2Right:
+		branchStart = kBranch3Start;
+		branchEnd = kBranch3End - kDecisionTime;
+		flag = kChaseEnteredBranchZone;
+		_subState = kSubBranch3;
+		break;
+	case kSubBranch3:
+		branchStart = kBranch4Start;
+		branchEnd = kBranch4End - kDecisionTime;
+		flag = kChaseEnteredBranchZone;
+		_subState = kSubBranch4;
+		break;
+	case kSubBranch4:
+		branchStart = kDeath5Start;
+		branchEnd = kDeath5End;
+		flag = kChaseFinished;
+		_subState = kSubBranch5;
+		break;
+	case kSubBranch5:
+		branchStart = kBranch6Start;
+		branchEnd = kBranch6End - kDecisionTime;
+		flag = kChaseEnteredBranchZone;
+		_subState = kSubBranch6;
+		break;
+	case kSubBranch6:
+		branchStart = kBranch7LeftStart;
+		branchEnd = kBranch7LeftEnd;
+		flag = kChaseExitedBranchZone;
+		_subState = kSubBranch7Left;
+		break;
+	case kSubBranch7Left:
+	case kSubBranch7Right:
+		branchStart = kExitStart;
+		branchEnd = kExitEnd;
+		flag = kChaseFinished;
+		_subState = kSubExit;
+		break;
+	default:
+		break;
+	}
+	
+	_subMovie.setSegment(branchStart, branchEnd);
+	_subMovie.setTime(branchStart);
+	
+	_subCallBack.setCallBackFlag(flag);
+	_subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void SubChase::branchRight() {
+	TimeValue branchStart, branchEnd;
+	NotificationFlags flag;
+	
+	branchStart = 0;
+	branchEnd = 0;
+	flag = 0;
+	switch (_subState) {
+	case kSubDialog:
+	case kSubBranch1:
+		branchStart = kBranch2RightStart;
+		branchEnd = kBranch2RightEnd;
+		// Don't show the controls hint when we approach the whale
+		// since the branch segments here are identical
+		flag = kChaseExitedBranchZone;
+		_subState = kSubBranch2Right;
+		break;
+	case kSubBranch2Left:
+	case kSubBranch2Right:
+		branchStart = kBranch3Start;
+		branchEnd = kBranch3End - kDecisionTime;
+		flag = kChaseEnteredBranchZone;
+		_subState = kSubBranch3;
+		break;
+	case kSubBranch3:
+		branchStart = kDeath4Start;
+		branchEnd = kDeath4End;
+		flag = kChaseFinished;
+		_subState = kSubBranch4;
+		break;
+	case kSubBranch4:
+		branchStart = kBranch5Start;
+		branchEnd = kBranch5End - kDecisionTime;
+		flag = kChaseEnteredBranchZone;
+		_subState = kSubBranch5;
+		break;
+	case kSubBranch5:
+		branchStart = kDeath6Start;
+		branchEnd = kDeath6End;
+		flag = kChaseFinished;
+		_subState = kSubBranch6;
+		break;
+	case kSubBranch6:
+		if (((PegasusEngine *)g_engine)->getRandomBit()) {
+			branchStart = kBranch7RightStart;
+			branchEnd = kBranch7RightEnd;
+			flag = kChaseExitedBranchZone;
+		} else {
+			branchStart = kDeath7Start;
+			branchEnd = kDeath7End;
+			flag = kChaseFinished;
+		}
+		_subState = kSubBranch7Right;
+		break;
+	case kSubBranch7Left:
+	case kSubBranch7Right:
+		branchStart = kExitStart;
+		branchEnd = kExitEnd;
+		flag = kChaseFinished;
+		_subState = kSubExit;
+		break;
+	default:
+		break;
+	}
+
+	_subMovie.setSegment(branchStart, branchEnd);
+	_subMovie.setTime(branchStart);
+	
+	_subCallBack.setCallBackFlag(flag);
+	_subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+}
+
+void SubChase::dontBranch() {
+	if (((PegasusEngine *)g_engine)->getRandomBit())
+		branchLeft();
+	else
+		branchRight();
+}
+
+void SubChase::startHintTimer(TimeValue time, TimeScale scale, HintTimerCode code) {
+	if (_canSteerSub) {
+		_hintFuse.primeFuse(time, scale);
+		_hintEvent.subChase = this;
+		_hintEvent.theEvent = code;
+		_hintFuse.setFunctor(new Common::Functor0Mem<void, HintTimerEvent>(&_hintEvent, &HintTimerEvent::fire));
+		_hintFuse.lightFuse();
+	}
+}
+
+void SubChase::hintTimerExpired(HintTimerEvent &event) {
+	switch (event.theEvent) {
+	case kStartedHint:
+		_hintPict.show();
+		startBlinkTimer(10, 10, kEnteredBlinkState);
+		startHintTimer(3920, kSubChaseScale, kEndedHint);
+		break;
+	case kEndedHint:
+		_hintPict.hide();
+		_blinkPict.hide();
+		_blinkFuse.stopFuse();
+		break;
+	default:
+		break;
+	}
+}
+
+void SubChase::startBlinkTimer(TimeValue time, TimeScale scale, BlinkTimerCode code) {
+	_blinkFuse.primeFuse(time, scale);
+	_blinkEvent.subChase = this;
+	_blinkEvent.theEvent = code;
+	_blinkFuse.setFunctor(new Common::Functor0Mem<void, BlinkTimerEvent>(&_blinkEvent, &BlinkTimerEvent::fire));
+	_blinkFuse.lightFuse();
+}
+
+void SubChase::blinkTimerExpired(BlinkTimerEvent &event) {
+	switch (event.theEvent) {
+	case kEnteredBlinkState:
+		_hintPict.hide();
+		_blinkPict.show();
+		startBlinkTimer(5, 10, kExitedBlinkState);
+		break;
+	case kExitedBlinkState:
+		_blinkPict.hide();
+		_hintPict.show();
+		startBlinkTimer(10, 10, kEnteredBlinkState);
+		break;
+	default:
+		break;
+	}
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/norad/alpha/subchase.h b/engines/pegasus/neighborhood/norad/alpha/subchase.h
new file mode 100644
index 0000000..6eeb6d5
--- /dev/null
+++ b/engines/pegasus/neighborhood/norad/alpha/subchase.h
@@ -0,0 +1,109 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * Additional copyright for this file:
+ * Copyright (C) 1995-2013 Presto Studios, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PEGASUS_NEIGHBORHOOD_NORAD_ALPHA_SUBCHASE_H
+#define PEGASUS_NEIGHBORHOOD_NORAD_ALPHA_SUBCHASE_H
+
+#include "pegasus/chase.h"
+#include "pegasus/movie.h"
+
+namespace Pegasus {
+
+class NoradAlpha;
+class SubChase;
+
+enum HintTimerCode {
+	kStartedHint,
+	kEndedHint
+};
+
+struct HintTimerEvent {
+	SubChase *subChase;
+	HintTimerCode theEvent;
+
+	void fire();
+};
+
+enum BlinkTimerCode {
+	kEnteredBlinkState,
+	kExitedBlinkState
+};
+
+struct BlinkTimerEvent {
+	SubChase *subChase;
+	BlinkTimerCode theEvent;
+
+	void fire();
+};
+
+class SubChase : public ChaseInteraction {
+friend class NoradAlpha;
+friend struct HintTimerEvent;
+friend struct BlinkTimerEvent;
+public:
+
+	SubChase(Neighborhood *);
+	virtual ~SubChase() {}
+
+	void handleInput(const Input &, const Hotspot *);
+
+protected:
+
+	void openInteraction();
+	void initInteraction();
+	void closeInteraction();
+	
+	void receiveNotification(Notification *, const NotificationFlags);
+	
+	void startBranching();
+	void setUpBranch();
+	void branchLeft();
+	void branchRight();
+	void dontBranch();
+	
+	void startHintTimer(TimeValue, TimeScale, HintTimerCode);
+	void hintTimerExpired(HintTimerEvent &);
+	
+	void startBlinkTimer(TimeValue, TimeScale, BlinkTimerCode);
+	void blinkTimerExpired(BlinkTimerEvent &);
+	
+	Movie _subMovie;
+	NotificationCallBack _subCallBack;
+	Picture _hintPict;
+	Picture _blinkPict;
+	FuseFunction _hintFuse;
+	FuseFunction _blinkFuse;
+	
+	HintTimerEvent _hintEvent;
+	BlinkTimerEvent _blinkEvent;
+	
+	short _subState;
+
+	bool _canSteerSub;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/norad/constants.h b/engines/pegasus/neighborhood/norad/constants.h
index 37c1769..68e4bcf 100644
--- a/engines/pegasus/neighborhood/norad/constants.h
+++ b/engines/pegasus/neighborhood/norad/constants.h
@@ -216,6 +216,7 @@ static const InteractionID kNoradElevatorInteractionID = 3;
 static const InteractionID kNoradPressureDoorInteractionID = 4;
 static const InteractionID kNoradSubControlRoomInteractionID = 5;
 static const InteractionID kNoradSubPlatformInteractionID = 6;
+static const InteractionID kNoradSubChaseInteractionID = 7;
 
 /////////////////////////////////////////////
 //
@@ -265,6 +266,12 @@ static const CoordType kNoradLowerDownTop = kNavAreaTop + 212;
 static const CoordType kNoradPlatformLeft = kNavAreaLeft + 36;
 static const CoordType kNoradPlatformTop = kNavAreaTop + 87;
 
+static const CoordType kNoradSubSteerLeft = 288;
+static const CoordType kNoradSubSteerTop = 28;
+
+static const CoordType kNoradSubHintLeft = 480;
+static const CoordType kNoradSubHintTop = 240;
+
 static const CoordType kNoradSubControlLeft = kNavAreaLeft + 0;
 static const CoordType kNoradSubControlTop = kNavAreaTop + 84;
 
@@ -385,8 +392,9 @@ static const DisplayElementID kClawMonitorGreenBallID = kSubControlCWID + 1;
 
 // Norad Delta display IDs.
 
-static const DisplayElementID kGlobeMonitorID = kNeighborhoodDisplayID;
-static const DisplayElementID kGlobeMovieID = kGlobeMonitorID + 14;
+static const DisplayElementID kGlobeRobotID = kNeighborhoodDisplayID;
+static const DisplayElementID kGlobeMonitorID = kGlobeRobotID + 1;
+static const DisplayElementID kGlobeMovieID = kGlobeMonitorID + 1;
 static const DisplayElementID kGlobeCircleLeftID = kGlobeMovieID + 1;
 static const DisplayElementID kGlobeCircleRightID = kGlobeCircleLeftID + 1;
 static const DisplayElementID kGlobeCircleUpID = kGlobeCircleRightID + 1;
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.cpp b/engines/pegasus/neighborhood/norad/delta/globegame.cpp
index 0b95e9b..db90daf 100644
--- a/engines/pegasus/neighborhood/norad/delta/globegame.cpp
+++ b/engines/pegasus/neighborhood/norad/delta/globegame.cpp
@@ -25,6 +25,7 @@
 
 #include "pegasus/cursor.h"
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/delta/globegame.h"
 #include "pegasus/neighborhood/norad/delta/noraddelta.h"
@@ -387,10 +388,22 @@ static const TimeValue kGlobeMovieStartTime = 2 * 2 * kNumLongSlices * 600 / 15;
 static const TimeValue kTimePerGlobeFrame = 40;
 
 static const NotificationFlags kGlobeSplash1Finished = 1;
-static const NotificationFlags kGlobeTimerExpired = kGlobeSplash1Finished << 1;
+static const NotificationFlags kGlobeRobot1Finished = kGlobeSplash1Finished << 1;
+static const NotificationFlags kGlobeRobot2Finished = kGlobeRobot1Finished << 1;
+static const NotificationFlags kGlobeRobot3Finished = kGlobeRobot2Finished << 1;
+static const NotificationFlags kGlobeRobot4Finished = kGlobeRobot3Finished << 1;
+static const NotificationFlags kGlobeRobot5Finished = kGlobeRobot4Finished << 1;
+static const NotificationFlags kGlobeRobot6Finished = kGlobeRobot5Finished << 1;
+static const NotificationFlags kGlobeTimerExpired = kGlobeRobot6Finished << 1;
 static const NotificationFlags kMaxDeactivatedFinished = kGlobeTimerExpired << 1;
 
 static const NotificationFlags kGlobeNotificationFlags = kGlobeSplash1Finished |
+													kGlobeRobot1Finished |
+													kGlobeRobot2Finished |
+													kGlobeRobot3Finished |
+													kGlobeRobot4Finished |
+													kGlobeRobot5Finished |
+													kGlobeRobot6Finished |
 													kGlobeTimerExpired |
 													kMaxDeactivatedFinished;
 
@@ -440,10 +453,10 @@ float radiansToDegrees(float angle) {
 }
 
 GlobeGame::GlobeGame(Neighborhood *handler) : GameInteraction(kNoradGlobeGameInteractionID, handler),
-		_monitorMovie(kGlobeMonitorID), _globeMovie(kGlobeMovieID), _upperNamesMovie(kGlobeUpperNamesID),
-		_lowerNamesMovie(kGlobeLowerNamesID), _globeNotification(kNoradGlobeNotificationID, (PegasusEngine *)g_engine),
-		_globeCircleLeft(kGlobeCircleLeftID), _globeCircleRight(kGlobeCircleRightID),
-		_globeCircleUp(kGlobeCircleUpID), _globeCircleDown(kGlobeCircleDownID),
+		_robotMovie(kGlobeRobotID), _monitorMovie(kGlobeMonitorID), _globeMovie(kGlobeMovieID),
+		_upperNamesMovie(kGlobeUpperNamesID), _lowerNamesMovie(kGlobeLowerNamesID),
+		_globeNotification(kNoradGlobeNotificationID, (PegasusEngine *)g_engine), _globeCircleLeft(kGlobeCircleLeftID),
+		_globeCircleRight(kGlobeCircleRightID), _globeCircleUp(kGlobeCircleUpID), _globeCircleDown(kGlobeCircleDownID),
 		_motionHighlightLeft(kMotionHiliteLeftID), _motionHighlightRight(kMotionHiliteRightID),
 		_motionHighlightUp(kMotionHiliteUpID), _motionHighlightDown(kMotionHiliteDownID),
 		_targetHighlightUpperLeft(kTargetHiliteUpperLeftID), _targetHighlightUpperRight(kTargetHiliteUpperRightID),
@@ -454,6 +467,19 @@ GlobeGame::GlobeGame(Neighborhood *handler) : GameInteraction(kNoradGlobeGameInt
 }
 
 void GlobeGame::openInteraction() {
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor1");
+		_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+		_robotMovie.setDisplayOrder(kGlobeMonitorLayer);
+		_robotMovie.startDisplaying();
+		_robotMovie.show();
+
+		_robotCallBack.setNotification(&_globeNotification);
+		_robotCallBack.initCallBack(&_robotMovie, kCallBackAtExtremes);
+		_robotCallBack.setCallBackFlag(kGlobeRobot1Finished);
+		_robotCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+	}
+
 	_monitorMovie.initFromMovieFile("Images/Norad Delta/N79 Left Monitor");
 	_monitorMovie.moveElementTo(kGlobeMonitorLeft, kGlobeMonitorTop);
 	_monitorMovie.setDisplayOrder(kGlobeMonitorLayer);
@@ -563,11 +589,20 @@ void GlobeGame::openInteraction() {
 }
 
 void GlobeGame::initInteraction() {
+	if (((PegasusEngine *)g_engine)->isDVD())
+		_robotMovie.start();
 	_monitorMovie.start();
 	_monitorMovie.redrawMovieWorld();
 }
 
 void GlobeGame::closeInteraction() {
+	if (((PegasusEngine *)g_engine)->isDVD()) {
+		_robotMovie.stop();
+		_robotMovie.stopDisplaying();
+		_robotMovie.releaseMovie();
+		_robotCallBack.releaseCallBack();
+	}
+
 	_monitorMovie.stop();
 	_monitorMovie.stopDisplaying();
 	_monitorMovie.releaseMovie();
@@ -626,16 +661,18 @@ void GlobeGame::receiveNotification(Notification *notification, const Notificati
 	if (notification == _neighborhoodNotification) {
 		switch (_gameState) {
 		case kPlayingRobotIntro:
-			_monitorMovie.stop();
-			_monitorMovie.setSegment(0, _monitorMovie.getDuration());
-			_monitorMovie.setTime(kSplash2End * scale - 1);
-			_monitorMovie.redrawMovieWorld();
-			_monitorMovie.setFlags(0);
+			if (!((PegasusEngine *)g_engine)->isDVD()) {
+				_monitorMovie.stop();
+				_monitorMovie.setSegment(0, _monitorMovie.getDuration());
+				_monitorMovie.setTime(kSplash2End * scale - 1);
+				_monitorMovie.redrawMovieWorld();
+				_monitorMovie.setFlags(0);
 
-			_owner->requestDelay(1, 2, kFilterNoInput, 0);
-			_owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut,
-					kFilterNoInput, kSpotSoundCompletedFlag);
-			_gameState = kPlayingStrikeAuthorized;
+				_owner->requestDelay(1, 2, kFilterNoInput, 0);
+				_owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut,
+						kFilterNoInput, kSpotSoundCompletedFlag);
+				_gameState = kPlayingStrikeAuthorized;
+			}
 			break;
 		case kPlayingStrikeAuthorized:
 			_monitorMovie.setSegment(kSplash3Start * scale, kSplash3Stop * scale);
@@ -741,20 +778,76 @@ void GlobeGame::receiveNotification(Notification *notification, const Notificati
 
 			switch (_currentSiloIndex) {
 			case 3:
-				_owner->requestSpotSound(kYouCannotPossiblyIn, kYouCannotPossiblyOut,
-						kFilterNoInput, kSpotSoundCompletedFlag);
+				if (!((PegasusEngine *)g_engine)->isDVD()) {
+					_owner->requestSpotSound(kYouCannotPossiblyIn, kYouCannotPossiblyOut,
+							kFilterNoInput, kSpotSoundCompletedFlag);
+				} else {
+					_robotMovie.hide();
+					_robotMovie.stopDisplaying();
+					_robotMovie.releaseMovie();
+
+					_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor2");
+					_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+					_robotMovie.startDisplaying();
+					_robotMovie.show();
+					_robotMovie.start();
+
+					_owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag);
+				}
 				break;
 			case 5:
-				_owner->requestSpotSound(kYouWillFailIn, kYouWillFailOut, kFilterNoInput,
-						kSpotSoundCompletedFlag);
+				if (!((PegasusEngine *)g_engine)->isDVD()) {
+					_owner->requestSpotSound(kYouWillFailIn, kYouWillFailOut, kFilterNoInput,
+							kSpotSoundCompletedFlag);
+				} else {
+					_robotMovie.hide();
+					_robotMovie.stopDisplaying();
+					_robotMovie.releaseMovie();
+
+					_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor3");
+					_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+					_robotMovie.startDisplaying();
+					_robotMovie.show();
+					_robotMovie.start();
+
+					_owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag);
+				}
 				break;
 			case 7:
-				_owner->requestSpotSound(kGiveUpHumanIn, kGiveUpHumanOut, kFilterNoInput,
-						kSpotSoundCompletedFlag);
+				if (!((PegasusEngine *)g_engine)->isDVD()) {
+					_owner->requestSpotSound(kGiveUpHumanIn, kGiveUpHumanOut, kFilterNoInput,
+							kSpotSoundCompletedFlag);
+				} else {
+					_robotMovie.hide();
+					_robotMovie.stopDisplaying();
+					_robotMovie.releaseMovie();
+
+					_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor4");
+					_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+					_robotMovie.startDisplaying();
+					_robotMovie.show();
+					_robotMovie.start();
+
+					_owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag);
+				}
 				break;
 			case 9:
-				_owner->requestSpotSound(kYouAreRunningIn, kYouAreRunningOut,
-						kFilterNoInput, kSpotSoundCompletedFlag);
+				if (!((PegasusEngine *)g_engine)->isDVD()) {
+					_owner->requestSpotSound(kYouAreRunningIn, kYouAreRunningOut,
+							kFilterNoInput, kSpotSoundCompletedFlag);
+				} else {
+					_robotMovie.hide();
+					_robotMovie.stopDisplaying();
+					_robotMovie.releaseMovie();
+
+					_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor5");
+					_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+					_robotMovie.startDisplaying();
+					_robotMovie.show();
+					_robotMovie.start();
+
+					_owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag);
+				}
 				break;
 			default:
 				_owner->requestSpotSound(kNewLaunchSiloIn, kNewLaunchSiloOut,
@@ -766,7 +859,7 @@ void GlobeGame::receiveNotification(Notification *notification, const Notificati
 			}
 			break;
 		case kRobotTaunting:
-			_owner->requestDelay(1, 1, kFilterNoInput, 0);
+			_owner->requestDelay(1, 2, kFilterNoInput, 0);
 			_owner->requestSpotSound(kNewLaunchSiloIn, kNewLaunchSiloOut, kFilterNoInput, kSpotSoundCompletedFlag);
 			_monitorMovie.setTime(kNewLaunchSiloTime * scale);
 			_monitorMovie.redrawMovieWorld();
@@ -790,27 +883,68 @@ void GlobeGame::receiveNotification(Notification *notification, const Notificati
 
 		switch (flags) {
 		case kGlobeSplash1Finished:
-			_owner->getExtraEntry(kN79BrightView, entry);
 			_monitorMovie.stop();
 			_monitorMovie.setSegment(kSplash1End * scale, kSplash2End * scale);
 			_monitorMovie.setFlags(kLoopTimeBase);
 			_monitorMovie.start();
-			_owner->showViewFrame(entry.movieStart);
-			_owner->requestSpotSound(kIJustBrokeIn, kIJustBrokeOut, kFilterNoInput, 0);
-			_owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag);
-			_gameState = kPlayingRobotIntro;
+			if (!((PegasusEngine *)g_engine)->isDVD()) {
+				_owner->getExtraEntry(kN79BrightView, entry);
+				_owner->showViewFrame(entry.movieStart);
+				_owner->requestSpotSound(kIJustBrokeIn, kIJustBrokeOut, kFilterNoInput, 0);
+				_owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag);
+				_gameState = kPlayingRobotIntro;
+			}
+			break;
+		case kGlobeRobot1Finished:
+			if (((PegasusEngine *)g_engine)->isDVD()) {
+				_owner->getExtraEntry(kN79BrightView, entry);
+				_monitorMovie.stop();
+				_monitorMovie.setSegment(0, _monitorMovie.getDuration());
+				_monitorMovie.setTime(kSplash2End * scale - 1);
+				_monitorMovie.redrawMovieWorld();
+				_monitorMovie.setFlags(0);
+
+				_owner->showViewFrame(entry.movieStart);
+				_owner->requestDelay(1, 2, kFilterNoInput, 0);
+				_owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut,
+						kFilterNoInput, kSpotSoundCompletedFlag);
+
+				_gameState = kPlayingStrikeAuthorized;
+			}
 			break;
 		case kGlobeTimerExpired:
 			// Missile launched, player loses.
+			_upperNamesMovie.hide();
+			_lowerNamesMovie.hide();
+			_countdown.hide();
+			_monitorMovie.setTime(kMissileLaunchedTime * scale);
+			_monitorMovie.redrawMovieWorld();
 			_owner->requestSpotSound(kMissileLaunchedIn, kMissileLaunchedOut, kFilterNoInput, kSpotSoundCompletedFlag);
 			_gameState = kPlayerLost1;
 			break;
 		case kMaxDeactivatedFinished:
 			_monitorMovie.stop();
 			_monitorMovie.setSegment(0, _monitorMovie.getDuration());
-			_owner->requestDelay(1, 2, kFilterNoInput, 0);
-			_owner->requestSpotSound(kTheOnlyGoodHumanIn, kTheOnlyGoodHumanOut, kFilterNoInput, 0);
-			_owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurNoradFinishedGlobeGame);
+			if (!((PegasusEngine *)g_engine)->isDVD()) {
+				_owner->requestDelay(1, 2, kFilterNoInput, 0);
+				_owner->requestSpotSound(kTheOnlyGoodHumanIn, kTheOnlyGoodHumanOut, kFilterNoInput, 0);
+				_owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag);
+			} else {
+				_robotMovie.hide();
+				_robotMovie.stopDisplaying();
+				_robotMovie.releaseMovie();
+
+				_robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor6");
+				_robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+				_robotMovie.setDisplayOrder(kGlobeCountdownLayer + 1);
+				_robotMovie.startDisplaying();
+				_robotMovie.show();
+				_robotMovie.start();
+
+				_owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag);
+			}
 			_gameState = kPlayerWon2;
 			break;
 		default:
@@ -874,56 +1008,89 @@ void GlobeGame::spinGlobe(const Input &input, const Hotspot *spot, GlobeTrackDir
 }
 
 void GlobeGame::clickGlobe(const Input &input) {
-	int16 newSilo = findClickedSilo(input);
-
-	if (newSilo != -1) {
-		_targetHighlightUpperLeft.hide();
-		_targetHighlightUpperRight.hide();
-		_targetHighlightLowerLeft.hide();
-		_targetHighlightLowerRight.hide();
-		_lowerNamesMovie.show();
-		_lowerNamesMovie.setTime(newSilo * _lowerNamesMovie.getScale());
-		_lowerNamesMovie.redrawMovieWorld();
-		_owner->requestSpotSound(kSiloBeepIn, kSiloBeepOut, kFilterNoInput, 0);
+	Movie movie(kNoDisplayElement);
+	Input movieInput;
+
+	if (((PegasusEngine *)g_engine)->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) {
+		((PegasusEngine *)g_engine)->_cursor->hide();
+
+		movie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor7");
+		movie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
+		movie.moveElementTo(kNavAreaLeft, kNavAreaTop);
+		movie.setDisplayOrder(kGlobeCountdownLayer + 1);
+		movie.startDisplaying();
+		movie.show();
+		movie.start();
+
+		while (movie.isRunning() && !((PegasusEngine *)g_engine)->shouldQuit()) {
+			InputDevice.getInput(movieInput, kFilterNoInput);
+
+			((PegasusEngine *)g_engine)->checkCallBacks();
+			((PegasusEngine *)g_engine)->refreshDisplay();
+			((PegasusEngine *)g_engine)->_system->delayMillis(10);
+		}
 
-		if (newSilo == _targetSilo[_currentSiloIndex]) {
-			_currentSiloIndex++;
-			_countdown.stopCountdown();
-			_owner->requestSpotSound(kSiloDeactivatedIn, kSiloDeactivatedOut, kFilterNoInput, 0);
+		if (((PegasusEngine *)g_engine)->shouldQuit())
+			return;
 
-			if (_currentSiloIndex == kNumTargetSilos) {
-				// Player won.
-				_owner->requestDelay(1, 2, kFilterNoInput, 0);
-				_upperNamesMovie.hide();
-				_lowerNamesMovie.hide();
-				_countdown.hide();
-				_monitorMovie.setSegment(kMaxDeactivatedStart * _monitorMovie.getScale(),
-						kMaxDeactivatedStop * _monitorMovie.getScale());
-				_monitorMovie.setTime(kMaxDeactivatedStart * _monitorMovie.getScale());
-				_monitorCallBack.setCallBackFlag(kMaxDeactivatedFinished);
-				_monitorCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
-				_monitorMovie.start();
-				_owner->requestSpotSound(kMaximumDeactivationIn, kMaximumDeactivationOut,
-						kFilterNoInput, kSpotSoundCompletedFlag);
+		movie.hide();
+		movie.stopDisplaying();
+		movie.releaseMovie();
 
-				// This sound was left out of the original.
-				_owner->requestSpotSound(kAllSilosDeactivatedIn, kAllSilosDeactivatedOut,
-						kFilterNoInput, kSpotSoundCompletedFlag);
-
-				_gameState = kPlayerWon1;
+		((PegasusEngine *)g_engine)->_cursor->hideUntilMoved();
+	} else {
+		int16 newSilo = findClickedSilo(input);
+		if (newSilo != -1) {
+			_targetHighlightUpperLeft.hide();
+			_targetHighlightUpperRight.hide();
+			_targetHighlightLowerLeft.hide();
+			_targetHighlightLowerRight.hide();
+			_lowerNamesMovie.show();
+			_lowerNamesMovie.setTime(newSilo * _lowerNamesMovie.getScale());
+			_lowerNamesMovie.redrawMovieWorld();
+			_owner->requestSpotSound(kSiloBeepIn, kSiloBeepOut, kFilterNoInput, 0);
+
+			if (newSilo == _targetSilo[_currentSiloIndex]) {
+				_currentSiloIndex++;
+				_countdown.stopCountdown();
+				_owner->requestSpotSound(kSiloDeactivatedIn, kSiloDeactivatedOut, kFilterNoInput, 0);
+
+				if (_currentSiloIndex == kNumTargetSilos) {
+					// Player won.
+					_owner->requestDelay(1, 2, kFilterNoInput, 0);
+					_upperNamesMovie.hide();
+					_lowerNamesMovie.hide();
+					_countdown.hide();
+					_monitorMovie.setSegment(kMaxDeactivatedStart * _monitorMovie.getScale(),
+							kMaxDeactivatedStop * _monitorMovie.getScale());
+					_monitorMovie.setTime(kMaxDeactivatedStart * _monitorMovie.getScale());
+					_monitorCallBack.setCallBackFlag(kMaxDeactivatedFinished);
+					_monitorCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+					_monitorMovie.start();
+					_owner->requestSpotSound(kMaximumDeactivationIn, kMaximumDeactivationOut,
+							kFilterNoInput, kSpotSoundCompletedFlag);
+
+					// This sound was left out of the original.
+					_owner->requestSpotSound(kAllSilosDeactivatedIn, kAllSilosDeactivatedOut,
+							kFilterNoInput, kSpotSoundCompletedFlag);
+
+					_gameState = kPlayerWon1;
+				} else {
+					_owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag);
+					_upperNamesMovie.hide();
+					_lowerNamesMovie.hide();
+					_countdown.hide();
+					_monitorMovie.setTime(kSiloDeactivatedTime * _monitorMovie.getScale());
+					_monitorMovie.redrawMovieWorld();
+					_gameState = kSiloDeactivated;
+				}
 			} else {
-				_owner->requestDelay(2, 1, kFilterNoInput, kDelayCompletedFlag);
-				_upperNamesMovie.hide();
-				_lowerNamesMovie.hide();
-				_countdown.hide();
-				_monitorMovie.setTime(kSiloDeactivatedTime * _monitorMovie.getScale());
-				_monitorMovie.redrawMovieWorld();
-				_gameState = kSiloDeactivated;
+				_owner->requestDelay(5, 1, kFilterNoInput, kDelayCompletedFlag);
+				_gameState = kDelayingPlayer;
+				// Play "incorrect" sound?
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB38", kArthurNoradSelectedIncorrectSilo);
 			}
-		} else {
-			_owner->requestDelay(5, 1, kFilterNoInput, kDelayCompletedFlag);
-			_gameState = kDelayingPlayer;
-			// Play "incorrect" sound?
 		}
 	}
 }
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.h b/engines/pegasus/neighborhood/norad/delta/globegame.h
index 73ed488..89c1afd 100644
--- a/engines/pegasus/neighborhood/norad/delta/globegame.h
+++ b/engines/pegasus/neighborhood/norad/delta/globegame.h
@@ -137,11 +137,13 @@ protected:
 	void screenPointTo3DPoint(int16, int16, Point3D &);
 	bool lineHitsGlobe(const Line3D &, Point3D &);
 
+	Movie _robotMovie;
 	Movie _monitorMovie;
 	Movie _globeMovie;
 	Movie _upperNamesMovie;
 	Movie _lowerNamesMovie;
 	Notification _globeNotification;
+	NotificationCallBack _robotCallBack;
 	NotificationCallBack _monitorCallBack;
 	GlobeTracker _globeTracker;
 	Picture _globeCircleLeft;
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp b/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
index 1eea2f0..e20ee96 100644
--- a/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
+++ b/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
@@ -28,6 +28,7 @@
 #include "pegasus/interface.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/items/biochips/retscanchip.h"
 #include "pegasus/items/inventory/airmask.h"
@@ -265,21 +266,39 @@ void NoradDelta::loadAmbientLoops() {
 	if (GameState.getNoradArrivedFromSub()) {
 		RoomID room = GameState.getCurrentRoom();
 
-		if (room == kNorad79West) {
-			if (_privateFlags.getFlag(kNoradPrivateFinishedGlobeGameFlag))
-				loadLoopSound1("Sounds/Norad/GlobAmb2.22K.AIFF");
-			else
+		if (room >= kNorad78 && room <= kNorad79West) {
+			if (GameState.getNoradPlayedGlobeGame()) {
+				// blitter moved clone2727's globe room loop fix up here
+				// since the original didn't play the red alert sound during the
+				// globe game.
+
+				// clone2727 added this fix so we can play the correct sound
+				// with the DVD version. This originally loaded it into slot 2,
+				// which in addition to having the corrupted sound on the disk,
+				// caused it to never play.
+				if (_vm->isDVD())
+					loadLoopSound1("Sounds/Norad/GlobAmb2.32K.AIFF");
+				else
+					loadLoopSound1("Sounds/Norad/GlobAmb2.22K.AIFF");
+			} else
 				loadLoopSound1("Sounds/Norad/RedAlert.22K.AIFF");
-		} else if (room >= kNorad78 && room <= kNorad79) {
-			// clone2727 says: This looks like it should be loadLoopSound1...
-			loadLoopSound2("Sounds/Norad/RedAlert.22K.AIFF");
 		} else if (GameState.getNoradGassed()) {
-			if (room >= kNorad41 && room <= kNorad49South)
-				loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3);
-			else if (room >= kNorad59 && room <= kNorad60West)
-				loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3);
-			else
-				loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume);
+			if (room >= kNorad41 && room <= kNorad49South) {
+				if (_vm->isDVD())
+					loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", kNoradWarningVolume * 3);
+				else
+					loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3);
+			} else if (room >= kNorad59 && room <= kNorad60West) {
+				if (_vm->isDVD())
+					loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.32K.AIFF", kNoradWarningVolume * 3);
+				else
+					loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3);
+			} else {
+				if (_vm->isDVD())
+					loadLoopSound1("Sounds/Norad/WARNING LOOP.32K.AIFF", kNoradWarningVolume);
+				else
+					loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume);
+			}
 		} else {
 			loadLoopSound1("");
 		}
@@ -290,15 +309,22 @@ void NoradDelta::loadAmbientLoops() {
 			else
 				loadLoopSound2("Sounds/Norad/SUCKING WIND.22K.AIFF", kNoradSuckWindVolume, 0, 0);
 		} else {
-			if (room == kNorad54North)
-				loadLoopSound2("Sounds/Norad/N54NAS.22K.AIFF", 0x100 / 2);
-			else
+			if (room == kNorad54North) {
+				if (_vm->isDVD())
+					loadLoopSound2("Sounds/Norad/N54NAS.32K.AIFF", 0x100 / 2);
+				else
+					loadLoopSound2("Sounds/Norad/N54NAS.22K.AIFF", 0x100 / 2);
+			} else
 				loadLoopSound2("");
 		}
 	} else {
 		// Start them off at zero...
-		if (GameState.getNoradGassed())
-			loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", 0, 0, 0);
+		if (GameState.getNoradGassed()) {
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", 0, 0, 0);
+			else
+				loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", 0, 0, 0);
+		}
 		if (!g_airMask->isAirFilterOn())
 			loadLoopSound2("Sounds/Norad/SUCKING WIND.22K.AIFF", 0, 0, 0);
 	}
@@ -328,39 +354,50 @@ void NoradDelta::arriveAt(const RoomID room, const DirectionConstant direction)
 
 	switch (room) {
 	case kNorad41:
-		if (direction == kEast && !GameState.getNoradArrivedFromSub()) {
-			GameState.setNoradPlayedGlobeGame(false);
+		if (direction == kEast) {
+			if (!GameState.getNoradArrivedFromSub()) {
+				GameState.setNoradPlayedGlobeGame(false);
 
-			GameState.setNoradBeatRobotWithClaw(false);
-			GameState.setNoradBeatRobotWithDoor(false);
-			GameState.setNoradRetScanGood(false);
+				GameState.setNoradBeatRobotWithClaw(false);
+				GameState.setNoradBeatRobotWithDoor(false);
+				GameState.setNoradRetScanGood(false);
 
-			GameState.setScoringExitedSub(true);
+				GameState.setScoringExitedSub(true);
 
-			getExtraEntry(kArriveFromSubChase, entry);
+				getExtraEntry(kArriveFromSubChase, entry);
 
-			loop1Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -
-					entry.movieStart, kNoradWarningVolume);
-			loop1Spec.insertFaderKnot(7320, 0);
-			loop1Spec.insertFaderKnot(7880, kNoradWarningVolume);
+				loop1Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -
+						entry.movieStart, kNoradWarningVolume);
+				loop1Spec.insertFaderKnot(7320, 0);
+				loop1Spec.insertFaderKnot(7880, kNoradWarningVolume);
 
-			loop2Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -
-					entry.movieStart, kNoradSuckWindVolume);
-			loop1Spec.insertFaderKnot(7320, 0);
-			loop1Spec.insertFaderKnot(7880, kNoradSuckWindVolume);
+				loop2Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -
+						entry.movieStart, kNoradSuckWindVolume);
+				loop1Spec.insertFaderKnot(7320, 0);
+				loop1Spec.insertFaderKnot(7880, kNoradSuckWindVolume);
 
-			startExtraSequence(kArriveFromSubChase, kExtraCompletedFlag, kFilterNoInput);
+				startExtraSequence(kArriveFromSubChase, kExtraCompletedFlag, kFilterNoInput);
 
-			startLoop1Fader(loop1Spec);
-			startLoop2Fader(loop2Spec);
+				startLoop1Fader(loop1Spec);
+				startLoop2Fader(loop2Spec);
+			} else {
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA08", kArthurNoradExitedSub);
+			}
 		}
 		break;
+	case kNorad54:
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA71", kArthurNoradApproachedDamagedDoor);
+		break;
 	case kNorad54North:
 		GameState.setScoringSawRobotAt54North(true);
 		break;
 	case kNorad68:
 		if (GameState.getNoradRetScanGood())
 			openDoor();
+		else if (!_vm->playerHasItemID(kRetinalScanBiochip) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurNoradAtRetScanNoBiochip);
 		break;
 	case kNorad68West:
 		arriveAtNorad68West();
@@ -396,6 +433,20 @@ void NoradDelta::arriveAtNorad79West() {
 		newInteraction(kNoradGlobeGameInteractionID);
 }
 
+void NoradDelta::turnTo(const DirectionConstant direction) {
+	Norad::turnTo(direction);
+	if (g_arthurChip) {
+		switch (GameState.getCurrentRoomAndView()) {
+		case MakeRoomView(kNorad54, kNorth):
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA71", kArthurNoradApproachedDamagedDoor);
+			break;
+		case MakeRoomView(kNorad68, kWest):
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurNoradApproachedDamagedDoor);
+			break;
+		}
+	}
+}
+
 void NoradDelta::bumpIntoWall() {
 	requestSpotSound(kDeltaBumpIntoWallIn, kDeltaBumpIntoWallOut, kFilterNoInput, 0);
 	Neighborhood::bumpIntoWall();
@@ -423,7 +474,11 @@ void NoradDelta::finishedGlobeGame() {
 	_privateFlags.setFlag(kNoradPrivateFinishedGlobeGameFlag, true);
 	GameState.setScoringFinishedGlobeGame(true);
 	loadAmbientLoops();
-	g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN60WD1", false, kWarningInterruption);
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA63", kArthurNoradThreatenedByRobot);
+	if (g_AIArea->isChattyAI())
+		g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN60WD1", false, kWarningInterruption);
+	updateViewFrame();
 }
 
 bool NoradDelta::playingAgainstRobot() {
@@ -451,7 +506,8 @@ void NoradDelta::playerBeatRobotWithDoor() {
 	GameState.setNoradBeatRobotWithDoor(true);
 	updateViewFrame();
 	GameState.setScoringStoppedNoradRobot(true);
-	g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption);
+	if (g_AIArea->isChattyAI())
+		g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption);
 }
 
 void NoradDelta::playerBeatRobotWithClaw() {
@@ -459,7 +515,8 @@ void NoradDelta::playerBeatRobotWithClaw() {
 	updateViewFrame();
 	GameState.setScoringStoppedNoradRobot(true);
 	GameState.setScoringNoradGandhi(true);
-	g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption);
+	if (g_AIArea->isChattyAI())
+		g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption);
 }
 
 TimeValue NoradDelta::getViewTime(const RoomID room, const DirectionConstant direction) {
@@ -604,12 +661,27 @@ void NoradDelta::receiveNotification(Notification *notification, const Notificat
 		case kN59RobotHeadOpens:
 		case kN60RobotHeadOpens:
 			_privateFlags.setFlag(kNoradPrivateRobotHeadOpenFlag, true);
+			if (g_arthurChip) {
+				switch (_vm->getRandomNumber(2)) {
+				case 0:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurNoradRobotHeadOpen);
+					break;
+				case 1:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurNoradRobotHeadOpen);
+					break;
+				case 2:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurNoradRobotHeadOpen);
+					break;
+				}
+			}
 			break;
 		case kNoradDeltaRetinalScanBad:
 			retScan = (RetScanChip *)_vm->getCurrentBiochip();
 			retScan->setItemState(kNormalItem);
 			playSpotSoundSync(kRetinalScanFailedIn, kRetinalScanFailedOut);
 			downButton(dummy);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA13", kArthurNoradAtRetScanNoBiochip);
 			break;
 		case kNoradDeltaRetinalScanGood:
 			retScan = (RetScanChip *)_vm->getCurrentBiochip();
@@ -623,6 +695,9 @@ void NoradDelta::receiveNotification(Notification *notification, const Notificat
 		}
 
 		_interruptionFilter = kFilterAllInput;
+	} else if ((flags & kSpotSoundCompletedFlag) != 0) {
+		if (_spotSounds.getStart() == kToDeactivateIn && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB41", kArthurNoradStartGlobeGame);
 	}
 
 	g_AIArea->checkMiddleArea();
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.h b/engines/pegasus/neighborhood/norad/delta/noraddelta.h
index 11065f2..82aa7a9 100644
--- a/engines/pegasus/neighborhood/norad/delta/noraddelta.h
+++ b/engines/pegasus/neighborhood/norad/delta/noraddelta.h
@@ -88,6 +88,7 @@ protected:
 	virtual void arriveAt(const RoomID, const DirectionConstant);
 	void arriveAtNorad68West();
 	void arriveAtNorad79West();
+	void turnTo(const DirectionConstant);
 	TimeValue getViewTime(const RoomID, const DirectionConstant);
 	void openDoor();
 	void activateHotspots();
diff --git a/engines/pegasus/neighborhood/norad/norad.cpp b/engines/pegasus/neighborhood/norad/norad.cpp
index 53b3ff9..177b908 100644
--- a/engines/pegasus/neighborhood/norad/norad.cpp
+++ b/engines/pegasus/neighborhood/norad/norad.cpp
@@ -27,6 +27,7 @@
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/inventory/airmask.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/norad.h"
@@ -162,10 +163,14 @@ void Norad::arriveAtNoradElevator() {
 
 void Norad::arriveAtUpperPressureDoorRoom() {
 	newInteraction(kNoradPressureDoorInteractionID);
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA69", kArthurNoradReachedPressureDoor);
 }
 
 void Norad::arriveAtLowerPressureDoorRoom() {
 	newInteraction(kNoradPressureDoorInteractionID);
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA69", kArthurNoradReachedPressureDoor);
 }
 
 void Norad::arriveAtSubPlatformRoom() {
@@ -199,10 +204,18 @@ CanOpenDoorReason Norad::canOpenDoor(DoorTable::Entry &entry) {
 }
 
 void Norad::cantOpenDoor(CanOpenDoorReason reason) {
+	bool firstLockedDoor;
+
 	if (reason == kCantOpenBadPressure)
 		playSpotSoundSync(_pressureSoundIn, _pressureSoundOut);
 	else
 		playSpotSoundSync(_accessDeniedIn, _accessDeniedOut);
+	if (g_arthurChip) {
+		firstLockedDoor = g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA65", kArthurNoradAttemptedLockedDoor);
+
+		if (!firstLockedDoor)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA68", kArthurNoradAttemptedLockedDoorAgain);
+	}
 }
 
 void Norad::startExitMovie(const ExitTable::Entry &exitEntry) {
diff --git a/engines/pegasus/neighborhood/norad/subcontrolroom.cpp b/engines/pegasus/neighborhood/norad/subcontrolroom.cpp
index d48481e..6812fa7 100644
--- a/engines/pegasus/neighborhood/norad/subcontrolroom.cpp
+++ b/engines/pegasus/neighborhood/norad/subcontrolroom.cpp
@@ -25,6 +25,7 @@
 
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/norad.h"
 #include "pegasus/neighborhood/norad/subcontrolroom.h"
@@ -562,6 +563,8 @@ void SubControlRoom::receiveNotification(Notification *notification, const Notif
 		switch (flags) {
 		case kAlphaSplashFinished:
 			setControlMonitorToTime(kMainMenuTime * _subControlScale, kAlphaMainMenu, true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurNoradSawClawMonitor);
 			break;
 		case kPrepHighlightFinished:
 			if (GameState.getNoradSubPrepState() == kSubDamaged)
@@ -655,6 +658,8 @@ void SubControlRoom::receiveNotification(Notification *notification, const Notif
 				hideEverything();
 				_robotState = kPlayerWon;
 				owner->startExtraSequence(kN60PlayerFollowsRobotToDoor, kExtraCompletedFlag, kFilterAllInput);
+				if (g_arthurChip)
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA67", kArthurNoradBeatRobotWithClaw);
 				break;
 			case kPlayerWon:
 				((NoradDelta *)owner)->playerBeatRobotWithClaw();
diff --git a/engines/pegasus/neighborhood/norad/subplatform.cpp b/engines/pegasus/neighborhood/norad/subplatform.cpp
index 97079a9..c13d812 100644
--- a/engines/pegasus/neighborhood/norad/subplatform.cpp
+++ b/engines/pegasus/neighborhood/norad/subplatform.cpp
@@ -26,6 +26,7 @@
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/norad/constants.h"
 #include "pegasus/neighborhood/norad/norad.h"
 #include "pegasus/neighborhood/norad/subplatform.h"
@@ -147,6 +148,8 @@ void SubPlatform::receiveNotification(Notification *notification, const Notifica
 			loop1Spec.insertFaderKnot(5080, 0);
 
 			owner->startExtraSequence(kNorad19ExitToSub, kExtraCompletedFlag, kFilterNoInput);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA07", kArthurNoradEnteredSub);
 
 			owner->startLoop1Fader(loop1Spec);
 			owner->startLoop2Fader(loop2Spec);
@@ -162,7 +165,7 @@ void SubPlatform::receiveNotification(Notification *notification, const Notifica
 			allowInput(true);
 			break;
 		}
-	} else if (notification == _neighborhoodNotification) {
+	} else if (notification == _neighborhoodNotification && !((PegasusEngine *)g_engine)->isDVD()) {
 		allowInput(true);
 		((PegasusEngine *)g_engine)->jumpToNewEnvironment(kNoradSubChaseID, kNoRoomID, kNoDirection);
 		GameState.setScoringEnteredSub(true);
diff --git a/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp b/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
index 190984f..b105857 100644
--- a/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
+++ b/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
@@ -31,6 +31,7 @@
 #include "pegasus/ai/ai_area.h"
 #include "pegasus/ai/ai_condition.h"
 #include "pegasus/ai/ai_rule.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/neighborhood/prehistoric/prehistoric.h"
 
 namespace Pegasus {
@@ -99,6 +100,9 @@ void Prehistoric::start() {
 	}
 
 	Neighborhood::start();
+	
+	if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric02, kSouth) && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA01", kArthurGoToPrehistoric);
 }
 
 class FinishPrehistoricAction : public AIPlayMessageAction {
@@ -270,8 +274,16 @@ void Prehistoric::turnTo(const DirectionConstant newDirection) {
 	Neighborhood::turnTo(newDirection);
 
 	Item *keyCard;
+	bool doArthurFeelLikeYodelingMovie = false;
 
 	switch (GameState.getCurrentRoomAndView()) {
+	case MakeRoomView(kPrehistoric08, kEast):
+	case MakeRoomView(kPrehistoric10, kEast):
+	case MakeRoomView(kPrehistoric12, kEast):
+	case MakeRoomView(kPrehistoric14, kEast):
+	case MakeRoomView(kPrehistoric25, kWest):
+		doArthurFeelLikeYodelingMovie = true;
+		break;	
 	case MakeRoomView(kPrehistoric18, kEast):
 		zoomToVault();
 		break;
@@ -285,6 +297,13 @@ void Prehistoric::turnTo(const DirectionConstant newDirection) {
 		// fall through
 	case MakeRoomView(kPrehistoric25, kEast):
 		setCurrentActivation(kActivationVaultClosed);
+		if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric25, kEast) &&
+			!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge);
+		break;
+	case MakeRoomView(kPrehistoric23, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs);
 		break;
 	case MakeRoomView(kPrehistoric16, kNorth):
 	case MakeRoomView(kPrehistoric21, kWest):
@@ -305,6 +324,8 @@ void Prehistoric::turnTo(const DirectionConstant newDirection) {
 		}
 		break;
 	}
+	if (doArthurFeelLikeYodelingMovie && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
 }
 
 void Prehistoric::zoomToVault() {
@@ -326,6 +347,7 @@ void Prehistoric::checkContinuePoint(const RoomID room, const DirectionConstant
 
 void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) {
 	Item *keyCard;
+	bool doArthurLetsSpreadOutMovie, doArthurFeelLikeYodelingMovie;
 
 	if (MakeRoomView(room, direction) == MakeRoomView(kPrehistoric25, kEast) &&
 			_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) {
@@ -336,6 +358,8 @@ void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction)
 
 	Neighborhood::arriveAt(room, direction);
 
+	doArthurLetsSpreadOutMovie = false;
+	doArthurFeelLikeYodelingMovie = false;
 	switch (MakeRoomView(room, direction)) {
 	case MakeRoomView(kPrehistoricDeath, kNorth):
 	case MakeRoomView(kPrehistoricDeath, kSouth):
@@ -356,6 +380,20 @@ void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction)
 			startExtraSequence(kPreArrivalFromTSA, kExtraCompletedFlag, kFilterNoInput);
 		}
 		break;
+	case MakeRoomView(kPrehistoric06, kNorth):
+	case MakeRoomView(kPrehistoric13, kWest):
+		doArthurLetsSpreadOutMovie = true;
+		break;
+	case MakeRoomView(kPrehistoric22North, kNorth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB44", kArthurPrehistoricSawBreaker);
+		break;
+	case MakeRoomView(kPrehistoric10, kEast):
+	case MakeRoomView(kPrehistoric12, kEast):
+	case MakeRoomView(kPrehistoric14, kEast):
+	case MakeRoomView(kPrehistoric25, kWest):
+		doArthurFeelLikeYodelingMovie = true;
+		break;
 	case MakeRoomView(kPrehistoric18, kEast):
 		zoomToVault();
 		break;
@@ -375,10 +413,11 @@ void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction)
 		if (g_AIArea)
 			g_AIArea->checkRules();
 		break;
+	case MakeRoomView(kPrehistoric13, kNorth):
+		doArthurLetsSpreadOutMovie = true;
 	case MakeRoomView(kPrehistoric08, kSouth):
 	case MakeRoomView(kPrehistoric10, kSouth):
 	case MakeRoomView(kPrehistoric12, kSouth):
-	case MakeRoomView(kPrehistoric13, kNorth):
 	case MakeRoomView(kPrehistoric14, kSouth):
 	case MakeRoomView(kPrehistoric15, kNorth):
 	case MakeRoomView(kPrehistoric16, kSouth):
@@ -396,8 +435,20 @@ void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction)
 		break;
 	case MakeRoomView(kPrehistoric25, kEast):
 		setCurrentActivation(kActivationVaultClosed);
+		if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge);
+		break;
+	case MakeRoomView(kPrehistoric23, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs);
 		break;
 	}
+	if (g_arthurChip) {
+		if (doArthurLetsSpreadOutMovie)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurPrehistoricReachedJunction);
+		else if (doArthurFeelLikeYodelingMovie)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
+	}
 }
 
 void Prehistoric::loadAmbientLoops() {
@@ -425,9 +476,9 @@ void Prehistoric::loadAmbientLoops() {
 	case kPrehistoric20:
 		// 1/4 volume.
 		if (_vm->isDVD()) // Updated sound for the DVD version
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32k.AIFF", 64);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 64);
 		else
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22k.AIFF", 64);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 64);
 		break;
 	case kPrehistoric08:
 	case kPrehistoric10:
@@ -438,16 +489,16 @@ void Prehistoric::loadAmbientLoops() {
 	case kPrehistoric21:
 		// 3/16 volume.
 		if (_vm->isDVD()) // Updated sound for the DVD version
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32k.AIFF", 48);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 48);
 		else
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22k.AIFF", 48);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 48);
 		break;
 	case kPrehistoric25:
 		// 1/8 volume.
 		if (_vm->isDVD()) // Updated sound for the DVD version
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32k.AIFF", 32);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 32);
 		else
-			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22k.AIFF", 32);
+			loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 32);
 		break;
 	case kPrehistoric22:
 	case kPrehistoric22North:
@@ -492,9 +543,9 @@ void Prehistoric::loadAmbientLoops() {
 	case kPrehistoric18:
 		if (_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) {
 			if (_vm->isDVD()) // Updated sound for the DVD version
-				loadLoopSound2("Sounds/Prehistoric/P18EAL00.44K.aiff", 0x100, 0, 0);
+				loadLoopSound2("Sounds/Prehistoric/P18EAL00.44K.AIFF", 0x100, 0, 0);
 			else
-				loadLoopSound2("Sounds/Prehistoric/P18EAL00.22k.AIFF", 0x100, 0, 0);
+				loadLoopSound2("Sounds/Prehistoric/P18EAL00.22K.AIFF", 0x100, 0, 0);
 		} else {
 			loadLoopSound2("");
 		}
@@ -504,9 +555,9 @@ void Prehistoric::loadAmbientLoops() {
 	case kPrehistoric22:
 	case kPrehistoric22North:
 		if (_vm->isDVD()) // Updated sound for the DVD version
-			loadLoopSound2("Sounds/Prehistoric/P24NAL00.32k.AIFF", 64);
+			loadLoopSound2("Sounds/Prehistoric/P24NAL00.32K.AIFF", 64);
 		else
-			loadLoopSound2("Sounds/Prehistoric/P24NAL00.22k.AIFF", 64);
+			loadLoopSound2("Sounds/Prehistoric/P24NAL00.22K.aiff", 64);
 		break;
 	}
 }
@@ -556,6 +607,8 @@ void Prehistoric::receiveNotification(Notification *notification, const Notifica
 			break;
 		case kPre18EastZoom:
 			startExtraSequence(kPre18EastZoomOut, kExtraCompletedFlag, kFilterNoInput);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA61", kArthurPrehistoricZoomedToVault);
 			break;
 		case kPre18EastZoomOut:
 			GameState.setPrehistoricSeenBridgeZoom(true);
@@ -566,26 +619,48 @@ void Prehistoric::receiveNotification(Notification *notification, const Notifica
 			GameState.setPrehistoricTriedToExtendBridge(false);
 			loadAmbientLoops();
 			GameState.setScoringExtendedBridge(true);
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurPrehistoricExtendedBridge);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA56", kArthurPrehistoricExtendedBridge);
+			}
 			break;
 		case kPre18EastBridgeOut:
 			GameState.setPrehistoricTriedToExtendBridge(true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA58", kArthurPrehistoricAttemptedBridge);
 			if (g_AIArea)
 				g_AIArea->checkMiddleArea();
 			break;
 		case kPre22ThrowBreaker:
 			GameState.setPrehistoricBreakerThrown(true);
 			GameState.setScoringThrewBreaker(true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA57", kArthurPrehistoricBreakerThrown);
 			break;
 		case kPre25EastUnlockingVaultNoLog:
 		case kPre25EastUnlockingVaultWithLog:
+			if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA05", kArthurPrehistoricUnlockedVault);
 			_vm->addItemToInventory((InventoryItem *)_vm->getAllItems().findItemByID(kJourneymanKey));
 			break;
 		}
+	} else if ((flags & kSpotCompletedFlag) != 0 &&
+				GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast)) {
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
 	}
 
 	g_AIArea->checkMiddleArea();
 }
 
+void Prehistoric::spotCompleted() {
+	Neighborhood::spotCompleted();
+	if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast) && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
+}
+
 Common::String Prehistoric::getBriefingMovie() {
 	Common::String movieName = Neighborhood::getBriefingMovie();
 
diff --git a/engines/pegasus/neighborhood/prehistoric/prehistoric.h b/engines/pegasus/neighborhood/prehistoric/prehistoric.h
index 17f9993..a2502b0 100644
--- a/engines/pegasus/neighborhood/prehistoric/prehistoric.h
+++ b/engines/pegasus/neighborhood/prehistoric/prehistoric.h
@@ -140,6 +140,7 @@ protected:
 	int16 getStaticCompassAngle(const RoomID, const DirectionConstant);
 	void getExitCompassMove(const ExitTable::Entry &, FaderMoveSpec &);
 	virtual void receiveNotification(Notification *, const NotificationFlags);
+	void spotCompleted();
 	void turnTo(const DirectionConstant);
 	void zoomToVault();
 	TimeValue getViewTime(const RoomID, const DirectionConstant);
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
index 75f652a..31f84e7 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
@@ -23,12 +23,16 @@
  *
  */
 
+#include "common/file.h"
+
+#include "pegasus/compass.h"
 #include "pegasus/cursor.h"
 #include "pegasus/energymonitor.h"
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
 #include "pegasus/items/biochips/aichip.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/neighborhood/caldoria/caldoria.h"
 #include "pegasus/neighborhood/norad/constants.h"
@@ -480,7 +484,7 @@ const CoordType kRedirectionFDRolloverTop = kNavAreaTop + 160;
 const CoordType kRedirectionCCDoorLeft = kNavAreaLeft + 174;
 const CoordType kRedirectionCCDoorTop = kNavAreaTop + 36;
 
-const CoordType kRedirectionRRDoorLeft = kNavAreaLeft + 418;
+const CoordType kRedirectionRRDoorLeft = kNavAreaLeft + 428;
 const CoordType kRedirectionRRDoorTop = kNavAreaTop + 32;
 
 const CoordType kRedirectionFDDoorLeft = kNavAreaLeft + 298;
@@ -521,6 +525,10 @@ static const bool kPegasusResolved = true;
 static const bool kPegasusCantExit = false;
 static const bool kPegasusCanExit = true;
 
+static const ExtraID kEasterEggJimenez = 1000;
+static const ExtraID kEasterEggCastillo = 1001;
+static const ExtraID kEasterEggSinclair = 1002;
+
 // Monitor modes
 enum {
 	kMonitorNeutral = 0,
@@ -644,7 +652,8 @@ void RipTimer::timeChanged(const TimeValue newTime) {
 }
 
 FullTSA::FullTSA(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Full TSA", kFullTSAID),
-		_ripTimer(kNoDisplayElement), _sprite1(kNoDisplayElement), _sprite2(kNoDisplayElement), _sprite3(kNoDisplayElement) {
+		_extraMovie(kNoDisplayElement), _blankMovie(kNoDisplayElement), _playedSolvedMusicCue(false), _ripTimer(kNoDisplayElement),
+		_sprite1(kNoDisplayElement), _sprite2(kNoDisplayElement), _sprite3(kNoDisplayElement) {
 	setIsItemTaken(kJourneymanKey);
 	setIsItemTaken(kPegasusBiochip);
 	setIsItemTaken(kMapBiochip);
@@ -652,6 +661,12 @@ FullTSA::FullTSA(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood
 
 void FullTSA::init() {
 	Neighborhood::init();
+	_extraMovieCallBack.setNotification(&_neighborhoodNotification);
+	if (Common::File::exists("Images/TSA/Blank TSA.movie"))
+		_blankMovie.initFromMovieFile("Images/TSA/Blank TSA.movie");
+	_blankMovie.setVolume(_vm->getSoundFXLevel());
+	_blankMovie.setDisplayOrder(kNavMovieOrder + 1);
+	_blankMovie.startDisplaying();
 	_ripTimer.setDisplayOrder(kRipTimerOrder);
 	_ripTimer.startDisplaying();
 
@@ -677,6 +692,11 @@ void FullTSA::dieUncreatedInTSA() {
 void FullTSA::start() {
 	g_energyMonitor->stopEnergyDraining();
 
+	if (_vm->isDVD()) {
+		_entranceMusic.attachFader(&_entranceFader);
+		_entranceMusic.initFromAIFFFile("Sounds/TSA/TSA Entrance.32K.AIFF");
+		_entranceFader.setMasterVolume(_vm->getAmbienceLevel() / 2);
+	}
 	if (!GameState.getScoringEnterTSA()) {
 		_utilityFuse.primeFuse(GameState.getTSAFuseTimeLimit());
 		_utilityFuse.setFunctor(new Common::Functor0Mem<void, FullTSA>(this, &FullTSA::dieUncreatedInTSA));
@@ -836,24 +856,38 @@ void FullTSA::loadAmbientLoops() {
 	switch (GameState.getTSAState()) {
 	case kTSAPlayerDetectedRip:
 	case kTSAPlayerNeedsHistoricalLog:
-		if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red))
-			loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 4, 0, 0);
-		else if (room == kTSA25Cyan || room == kTSA25Red)
-			loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 6, 0, 0);
-		else
-			loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 / 4, 0, 0);
+		if (_vm->isDVD()) {
+			if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red))
+				loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 * 3 / 16, 0, 0);
+			else if (room == kTSA25Cyan || room == kTSA25Red)
+				loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 / 8, 0, 0);
+			else
+				loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 * 3 / 16, 0, 0);
+		} else {
+			if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red))
+				loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 4, 0, 0);
+			else if (room == kTSA25Cyan || room == kTSA25Red)
+				loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 6, 0, 0);
+			else
+				loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 / 4, 0, 0);
+		}
 		break;
 	default:
-		if (room >= kTSA00 && room <= kTSA02)
-			loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
-		else if (room >= kTSA03 && room <= kTSA15)
-			loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
-		else if (room >= kTSA16 && room <= kTSA0B)
-			loadLoopSound1("Sounds/TSA/T14SAEO1.22K.AIFF");
-		else if (room >= kTSA21Cyan && room <= kTSA25Red)
-			loadLoopSound1("Sounds/TSA/T15SAE01.22K.AIFF");
-		else if (room >= kTSA26 && room <= kTSA37)
-			loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
+		if (_vm->isDVD()) {
+			if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37))
+				loadLoopSound1("Sounds/TSA/T01NAE.NEW.32K.AIFF", 0x100 * 3 / 4, 0, 0);
+			else if (room >= kTSA16 && room <= kTSA0B)
+				loadLoopSound1("Sounds/TSA/T14SAEO1.32K.AIFF", 0x100 * 3 / 4, 0, 0);
+			else if (room >= kTSA21Cyan && room <= kTSA25Red)
+				loadLoopSound1("Sounds/TSA/T15SAE01.32K.AIFF", 0x100 * 3 / 4, 0, 0);
+		} else {
+			if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37))
+				loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
+			else if (room >= kTSA16 && room <= kTSA0B)
+				loadLoopSound1("Sounds/TSA/T14SAEO1.22K.AIFF");
+			else if (room >= kTSA21Cyan && room <= kTSA25Red)
+				loadLoopSound1("Sounds/TSA/T15SAE01.22K.AIFF");
+		}
 		break;
 	}
 }
@@ -1107,6 +1141,50 @@ void FullTSA::getExtraEntry(const uint32 id, ExtraTable::Entry &extraEntry) {
 		extraEntry.movieStart += kFullTSAFrameDuration * 3;
 }
 
+void FullTSA::showViewFrame(TimeValue viewTime) {
+	if ((int32)viewTime >= 0) {
+		_turnPush.hide();
+		_navMovie.stop();
+		_navMovie.setFlags(0);
+		if (_blankMovie.isMovieValid() &&
+			(GameState.getTSAState() == kRobotsAtCommandCenter ||
+			GameState.getTSAState() == kRobotsAtFrontDoor ||
+			GameState.getTSAState() == kRobotsAtReadyRoom) &&
+			(GameState.getCurrentRoom() == kTSA0A ||
+			GameState.getCurrentRoom() == kTSA06) &&
+			(GameState.getCurrentDirection() == kEast ||
+			GameState.getCurrentDirection() == kWest)) {
+			viewTime = 0;
+			if (GameState.getCurrentRoom() == kTSA06)
+				viewTime = 2 * _blankMovie.getScale();
+			if (GameState.getCurrentDirection() == kWest)
+				viewTime += _blankMovie.getScale();
+
+			_navMovie.hide();
+			_blankMovie.setSegment(0, _blankMovie.getDuration());
+			_blankMovie.setTime(viewTime);
+
+			Common::Rect pushBounds;
+			_turnPush.getBounds(pushBounds);
+
+			_blankMovie.moveElementTo(pushBounds.left, pushBounds.top);
+			_blankMovie.show();
+			_blankMovie.redrawMovieWorld();
+		} else {
+			_blankMovie.hide();
+			_navMovie.setSegment(0, _navMovie.getDuration());
+			_navMovie.setTime(viewTime);
+
+			Common::Rect pushBounds;
+			_turnPush.getBounds(pushBounds);
+
+			_navMovie.moveElementTo(pushBounds.left, pushBounds.top);
+			_navMovie.show();
+			_navMovie.redrawMovieWorld();
+		}
+	}
+}
+
 void FullTSA::pickedUpItem(Item *item) {
 	BiochipItem *biochip;
 
@@ -1191,6 +1269,117 @@ void FullTSA::startDoorOpenMovie(const TimeValue startTime, const TimeValue stop
 	Neighborhood::startDoorOpenMovie(startTime, stopTime);
 }
 
+void FullTSA::startTurnPush(const TurnDirection turnDirection, const TimeValue newView, const DirectionConstant nextDir) {
+	if (g_AIArea)
+		g_AIArea->lockAIOut();
+
+	_vm->_cursor->hide();
+
+	GameState.setNextDirection(nextDir);
+
+	_interruptionFilter = kFilterNoInput;
+	_turnPush.stopFader();
+
+	// Set up callback.
+	_turnPushCallBack.setCallBackFlag(kTurnCompletedFlag);
+	_turnPushCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+
+	// Stop nav movie.
+	_navMovie.stop();
+	_navMovie.setFlags(0);
+
+	if (_blankMovie.isMovieValid() &&
+		(GameState.getTSAState() == kRobotsAtCommandCenter ||
+		GameState.getTSAState() == kRobotsAtFrontDoor ||
+		GameState.getTSAState() == kRobotsAtReadyRoom) &&
+		(GameState.getCurrentRoom() == kTSA0A || GameState.getCurrentRoom() == kTSA06) &&
+		(nextDir == kEast || nextDir == kWest)) {
+		TimeValue newRobotView = 0;
+		if (GameState.getCurrentRoom() == kTSA06)
+			newRobotView = 2 * _blankMovie.getScale();
+		if (nextDir == kWest)
+			newRobotView += _blankMovie.getScale();
+
+		_blankMovie.setSegment(0, _blankMovie.getDuration());
+
+		_pushIn.initFromMovieFrame(_blankMovie.getMovie(), newRobotView);
+		_turnPush.setInAndOutElements(&_pushIn, &_navMovie);		
+	} else {
+		// Set segment of nav movie to whole movie, so that subsequent initFromMovieFrame
+		// will work.
+		_navMovie.setSegment(0, _navMovie.getDuration());
+
+		_pushIn.initFromMovieFrame(_navMovie.getMovie(), newView);
+		if (_blankMovie.isMovieValid() &&
+			(GameState.getTSAState() == kRobotsAtCommandCenter ||
+			GameState.getTSAState() == kRobotsAtFrontDoor ||
+			GameState.getTSAState() == kRobotsAtReadyRoom) &&
+			(GameState.getCurrentRoom() == kTSA0A ||
+			GameState.getCurrentRoom() == kTSA06))
+			_turnPush.setInAndOutElements(&_pushIn, &_blankMovie);
+		else
+			_turnPush.setInAndOutElements(&_pushIn, &_navMovie);
+	}
+
+	_blankMovie.hide();
+	_navMovie.hide();
+
+	switch (turnDirection) {
+	case kTurnLeft:
+		_turnPush.setSlideDirection(kSlideRightMask);
+		break;
+	case kTurnRight:
+		_turnPush.setSlideDirection(kSlideLeftMask);
+		break;
+	case kTurnUp:
+		_turnPush.setSlideDirection(kSlideDownMask);
+		break;
+	case kTurnDown:
+		_turnPush.setSlideDirection(kSlideUpMask);
+		break;
+	}
+
+	_turnPush.show();
+
+	FaderMoveSpec moveSpec;
+	moveSpec.makeTwoKnotFaderSpec(60, 0, 0, 15, 1000);
+	_turnPush.startFader(moveSpec);
+
+	if (g_compass) {
+		_turnPush.pauseFader();
+
+		int32 startAngle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
+		int32 stopAngle = getStaticCompassAngle(GameState.getCurrentRoom(), nextDir);
+
+		if (turnDirection == kTurnLeft) {
+			if (startAngle < stopAngle)
+				startAngle += 360;
+		} else {
+			if (stopAngle < startAngle)
+				stopAngle += 360;
+		}
+
+		FaderMoveSpec turnSpec;
+		_turnPush.getCurrentFaderMove(turnSpec);
+
+		FaderMoveSpec compassMove;
+		compassMove.makeTwoKnotFaderSpec(turnSpec.getFaderScale(), turnSpec.getNthKnotTime(0), startAngle, turnSpec.getNthKnotTime(1), stopAngle);
+		g_compass->startFader(compassMove);
+	}
+
+	_turnPushCallBack.cancelCallBack();
+	_turnPush.continueFader();
+
+	do {
+		_vm->checkCallBacks();
+		_vm->refreshDisplay();
+		_vm->_system->delayMillis(10);
+	} while (_turnPush.isFading());
+
+	_turnPush.stopFader();
+	_neighborhoodNotification.setNotificationFlags(kTurnCompletedFlag, kTurnCompletedFlag);
+}
+
 InputBits FullTSA::getInputFilter() {
 	InputBits result = Neighborhood::getInputFilter();
 
@@ -1248,8 +1437,20 @@ void FullTSA::turnRight() {
 }
 
 void FullTSA::openDoor() {
+	FaderMoveSpec spec;
+
 	switch (GameState.getCurrentRoomAndView()) {
+	case MakeRoomView(kTSA14, kSouth):
+		if (_vm->isDVD()) {
+			spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0);
+			_entranceFader.startFader(spec);
+		}
+		break;
 	case MakeRoomView(kTSA15, kSouth):
+		if (_vm->isDVD()) {
+			spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0);
+			_entranceFader.startFader(spec);
+		}
 		if (GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog || GameState.getTSAState() == kRobotsAtFrontDoor)
 			setCurrentAlternate(kAltTSARedAlert);
 		break;
@@ -1258,6 +1459,26 @@ void FullTSA::openDoor() {
 	Neighborhood::openDoor();
 }
 
+void FullTSA::doorOpened() {
+	if (_vm->isDVD()) {
+		switch (GameState.getCurrentRoomAndView()) {
+		case MakeRoomView(kTSA02, kNorth):
+			if (_lastExtra == kTSA02NorthDoorWithAgent3 && g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB36", kArthurTSASawAgent3);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB37", kArthurTSASawAgent3);
+			}
+			break;
+		case MakeRoomView(kTSA16, kSouth):
+		case MakeRoomView(kTSA21Cyan, kSouth):
+			_entranceMusic.stopSound();
+			break;
+		}
+	}
+	Neighborhood::doorOpened();
+}
+
 CanMoveForwardReason FullTSA::canMoveForward(ExitTable::Entry &entry) {
 	if (GameState.getCurrentRoomAndView() == MakeRoomView(kTSA25Red, kNorth))
 		return kCantMoveBlocked;
@@ -1265,6 +1486,27 @@ CanMoveForwardReason FullTSA::canMoveForward(ExitTable::Entry &entry) {
 	return Neighborhood::canMoveForward(entry);
 }
 
+void FullTSA::moveForward() {
+	ExitTable::Entry exitEntry;
+	CanMoveForwardReason moveReason = kCanMoveForward;
+	FaderMoveSpec spec;
+
+	if (_vm->isDVD()) {
+		moveReason = canMoveForward(exitEntry);
+		if (moveReason == kCanMoveForward &&
+			GameState.getCurrentRoomAndView() == MakeRoomView(kTSA02, kNorth) &&
+			!GameState.allTimeZonesFinished()) {
+			_entranceMusic.playSound();
+			spec.makeOneKnotFaderSpec(255);
+			_entranceFader.startFader(spec);
+		}
+	}
+	Neighborhood::moveForward();
+	if (moveReason == kCanMoveForward && GameState.getCurrentRoomAndView() == MakeRoomView(kTSA01, kSouth) &&
+		GameState.allTimeZonesFinished() && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA51", kArthurTSALeaving);
+}
+
 CanOpenDoorReason FullTSA::canOpenDoor(DoorTable::Entry &entry) {
 	switch (GameState.getCurrentRoomAndView()) {
 	case MakeRoomView(kTSA02, kNorth):
@@ -1338,6 +1580,18 @@ void FullTSA::activateHotspots() {
 		if (!GameState.getTSAFrontDoorUnlockedOutside())
 			_vm->getAllHotspots().activateOneHotspot(kTSA02DoorSpotID);
 		break;
+	case MakeRoomView(kTSA0A, kEast):
+		if (GameState.getTSAState() == kRobotsAtCommandCenter ||
+			GameState.getTSAState() == kRobotsAtFrontDoor ||
+			GameState.getTSAState() == kRobotsAtReadyRoom)
+			_vm->getAllHotspots().deactivateOneHotspot(kTSA0AEastSpotID);
+		break;
+	case MakeRoomView(kTSA0A, kWest):
+		if (GameState.getTSAState() == kRobotsAtCommandCenter ||
+			GameState.getTSAState() == kRobotsAtFrontDoor ||
+			GameState.getTSAState() == kRobotsAtReadyRoom)
+			_vm->getAllHotspots().deactivateOneHotspot(kTSA0AWastSpotID);
+		break;
 	case MakeRoomView(kTSA0B, kEast):
 		if (GameState.getTSA0BZoomedIn())
 			switch (GameState.getTSAState()) {
@@ -1382,7 +1636,10 @@ void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
 		Neighborhood::clickInHotspot(input, clickedSpot);
 		break;
 	case kTSA03EastJimenezSpotID:
-		startExtraLongSequence(kTSA03JimenezZoomIn, kTSA03JimenezZoomOut, kExtraCompletedFlag, kFilterNoInput);
+		if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
+			startExtraSequence(kEasterEggJimenez, kExtraCompletedFlag, kFilterNoInput);
+		else
+			startExtraLongSequence(kTSA03JimenezZoomIn, kTSA03JimenezZoomOut, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kTSA03WestCrenshawSpotID:
 		startExtraLongSequence(kTSA03CrenshawZoomIn, kTSA03CrenshawZoomOut, kExtraCompletedFlag, kFilterNoInput);
@@ -1391,10 +1648,16 @@ void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
 		startExtraLongSequence(kTSA04MatsumotoZoomIn, kTSA04MatsumotoZoomOut, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kTSA04WestCastilleSpotID:
-		startExtraLongSequence(kTSA04CastilleZoomIn, kTSA04CastilleZoomOut, kExtraCompletedFlag, kFilterNoInput);
+		if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
+			startExtraSequence(kEasterEggCastillo, kExtraCompletedFlag, kFilterNoInput);
+		else
+			startExtraLongSequence(kTSA04CastilleZoomIn, kTSA04CastilleZoomOut, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kTSA05EastSinclairSpotID:
-		startExtraLongSequence(kTSA05SinclairZoomIn, kTSA05SinclairZoomOut, kExtraCompletedFlag, kFilterNoInput);
+		if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
+			startExtraSequence(kEasterEggSinclair, kExtraCompletedFlag, kFilterNoInput);
+		else
+			startExtraLongSequence(kTSA05SinclairZoomIn, kTSA05SinclairZoomOut, kExtraCompletedFlag, kFilterNoInput);
 		break;
 	case kTSA05WestWhiteSpotID:
 		startExtraLongSequence(kTSA05WhiteZoomIn, kTSA05WhiteZoomOut, kExtraCompletedFlag, kFilterNoInput);
@@ -1551,6 +1814,12 @@ void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
 	// Pegasus
 	case kTSA37NorthJumpToPrehistoricSpotID:
 		startExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput);
+		if (g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA30", kArthurTSAUsedPegasus);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA35", kArthurTSAUsedPegasus);
+		}
 		break;
 	case kTSA37NorthExitSpotID:
 		_sprite2.setCurrentFrameIndex(1);
@@ -1886,7 +2155,7 @@ void FullTSA::playRightComparison() {
 // TSA state is kTSABossSawHistoricalLog.
 void FullTSA::startRobotGame() {
 	requestExtraSequence(kTSA0BNorthCantChangeHistory, 0, kFilterNoInput);
-	requestExtraSequence(kTSA0BAIInterruption, 0, kFilterNoInput);
+	requestExtraSequence(kTSA0BAIInterruption, kExtraCompletedFlag, kFilterNoInput);
 	requestExtraSequence(kTSA0BShowGuardRobots, 0, kFilterNoInput);
 	requestExtraSequence(kTSA0BRobotsToCommandCenter, kExtraCompletedFlag, kFilterNoInput);
 }
@@ -1900,7 +2169,7 @@ void FullTSA::startUpRobotMonitor() {
 	_sprite1.addPICTResourceFrame(kRedirectionRRRolloverPICTID, true,
 			kRedirectionRRRolloverLeft - kRedirectionSprite1Left,
 			kRedirectionRRRolloverTop - kRedirectionSprite1Top);
-	_sprite1.addPICTResourceFrame(kRedirectionFDRolloverPICTID, false,
+	_sprite1.addPICTResourceFrame(kRedirectionFDRolloverPICTID, true,
 			kRedirectionFDRolloverLeft - kRedirectionSprite1Left,
 			kRedirectionFDRolloverTop - kRedirectionSprite1Top);
 	_sprite1.addPICTResourceFrame(kRedirectionCCDoorPICTID, true,
@@ -1909,7 +2178,7 @@ void FullTSA::startUpRobotMonitor() {
 	_sprite1.addPICTResourceFrame(kRedirectionRRDoorPICTID, true,
 			kRedirectionRRDoorLeft - kRedirectionSprite1Left,
 			kRedirectionRRDoorTop - kRedirectionSprite1Top);
-	_sprite1.addPICTResourceFrame(kRedirectionFDDoorPICTID, false,
+	_sprite1.addPICTResourceFrame(kRedirectionFDDoorPICTID, true,
 			kRedirectionFDDoorLeft - kRedirectionSprite1Left,
 			kRedirectionFDDoorTop - kRedirectionSprite1Top);
 	_sprite1.addPICTResourceFrame(kRedirectionClosePICTID, false,
@@ -1994,11 +2263,14 @@ void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) {
 			loopExtraSequence(kTSATransporterArrowLoop, 0);
 		}
 		break;
+	case MakeRoomView(kTSA01, kNorth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA22", kArthurTSAEnteredCave);
+		break;
 	case MakeRoomView(kTSA03, kNorth):
 	case MakeRoomView(kTSA05, kNorth):
 	case MakeRoomView(kTSA0A, kNorth):
 	case MakeRoomView(kTSA06, kNorth):
-	case MakeRoomView(kTSA07, kNorth):
 		if (_utilityFuse.isFuseLit())
 			_utilityFuse.stopFuse();
 		GameState.setScoringEnterTSA(true);
@@ -2009,6 +2281,13 @@ void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) {
 		if (!GameState.getTSASeenRobotGreeting())
 			startExtraSequence(kTSA04NorthRobotGreeting, kExtraCompletedFlag, kFilterNoInput);
 		break;
+	case MakeRoomView(kTSA07, kNorth):
+		if (_utilityFuse.isFuseLit())
+			_utilityFuse.stopFuse();
+		GameState.setScoringEnterTSA(true);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA23", kArthurTSAReachedJunction);
+		break;
 	case MakeRoomView(kTSA03, kSouth):
 		GameState.setTSAFrontDoorUnlockedInside(GameState.getTSAState() == kRobotsAtFrontDoor || GameState.allTimeZonesFinished());
 		break;
@@ -2093,8 +2372,15 @@ void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) {
 		arriveAtTSA25Red();
 		break;
 	case MakeRoomView(kTSA34, kSouth):
-		if (GameState.getLastRoom() == kTSA37)
+		if (GameState.getLastRoom() == kTSA37) {
 			closeDoorOffScreen(kTSA37, kNorth);
+			if (_vm->isDVD() && GameState.allTimeZonesFinished() && !_playedSolvedMusicCue) {
+				_solvedMusicCue.initFromAIFFFile("Sounds/TSA/TSA NORM.32K.AIFF");
+				_solvedMusicCue.setVolume(_vm->getAmbienceLevel());
+				_solvedMusicCue.playSound();
+				_playedSolvedMusicCue = true;
+			}
+		}
 		break;
 	case MakeRoomView(kTSA37, kNorth):
 		arriveAtTSA37();
@@ -2132,7 +2418,8 @@ void FullTSA::checkRobotLocations(const RoomID room, const DirectionConstant dir
 			switch (GameState.getTSAState()) {
 			case kRobotsAtCommandCenter:
 				if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) {
-					g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
+					if (g_AIArea->isChattyAI())
+						g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
 					_privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true);
 				}
 				break;
@@ -2286,7 +2573,8 @@ void FullTSA::turnTo(const DirectionConstant newDirection) {
 		switch (GameState.getTSAState()) {
 		case kRobotsAtCommandCenter:
 			if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) {
-				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
+				if (g_AIArea->isChattyAI())
+					g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
 				_privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true);
 			}
 			break;
@@ -2355,6 +2643,65 @@ void FullTSA::closeDoorOffScreen(const RoomID room, const DirectionConstant) {
 	}
 }
 
+void FullTSA::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
+	static const TimeValue times[3][2] = {
+		{ 0, 11720 },
+		{ 11720, 19840 },
+		{ 19840, 29960 }
+	};
+	TimeValue segmentStart = 0, segmentStop = 0;
+	bool loopSequence = false;
+	Common::Rect pushBounds;
+	NotificationFlags extraFlags;
+
+	switch (extraID) {
+	case kEasterEggJimenez:
+	case kEasterEggCastillo:
+	case kEasterEggSinclair:
+		_turnPush.getBounds(pushBounds);
+		_extraMovie.initFromMovieFile("Images/TSA/Wacky TSA.movie");
+		segmentStart = times[extraID - 1000][0];
+		segmentStop = times[extraID - 1000][1];
+		loopSequence = false;
+		
+		_lastExtra = extraID;
+		_turnPush.hide();
+		
+		if (!loopSequence && g_AIArea)
+			g_AIArea->lockAIOut();
+		
+		extraFlags = flags;
+		_interruptionFilter = interruptionFilter;
+		// Stop the nav movie before doing anything else
+		_navMovie.stop();
+		_navMovie.stopDisplaying();
+		
+		_extraMovie.setVolume(_vm->getSoundFXLevel());
+		_extraMovie.moveElementTo(pushBounds.left, pushBounds.top);
+		_extraMovie.setDisplayOrder(kNavMovieOrder + 1);
+		_extraMovie.startDisplaying();
+		_extraMovie.show();
+		_extraMovie.setFlags(0);
+		_extraMovie.setSegment(segmentStart, segmentStop);
+		_extraMovie.setTime(segmentStart);
+		if (loopSequence)
+			_extraMovie.setFlags(kLoopTimeBase);
+		else
+			extraFlags |= kNeighborhoodMovieCompletedFlag;
+		_extraMovieCallBack.cancelCallBack();
+		_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
+		if (extraFlags != 0) {
+			_extraMovieCallBack.setCallBackFlag(extraFlags);
+			_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		}
+		_extraMovie.start();
+		break;
+	default:
+		Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+		break;
+	}
+}
+
 void FullTSA::receiveNotification(Notification *notification, const NotificationFlags flags) {
 	ExtraID lastExtra = _lastExtra;
 
@@ -2372,12 +2719,15 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 	Neighborhood::receiveNotification(notification, flags);
 
 	InventoryItem *item;
+	bool doArthurSawBustMovie, doArthurRedirectedRobotsMovie;
 
 	if ((flags & kExtraCompletedFlag) != 0) {
 		// Only allow input if we're not in the middle of series of queue requests.
 		if (actionQueueEmpty())
 			_interruptionFilter = kFilterAllInput;
 
+		doArthurSawBustMovie = false;
+		doArthurRedirectedRobotsMovie = false;
 		switch (lastExtra) {
 		case kTSAGTCardSwipe:
 			item = (InventoryItem *)_vm->getAllItems().findItemByID(kKeyCard);
@@ -2408,21 +2758,43 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 			break;
 		case kTSA03JimenezZoomIn:
 			GameState.setScoringSawBust1(true);
+			doArthurSawBustMovie = true;
 			break;
 		case kTSA03CrenshawZoomIn:
 			GameState.setScoringSawBust2(true);
+			doArthurSawBustMovie = true;
 			break;
 		case kTSA04MatsumotoZoomIn:
 			GameState.setScoringSawBust3(true);
+			doArthurSawBustMovie = true;
 			break;
 		case kTSA04CastilleZoomIn:
 			GameState.setScoringSawBust4(true);
+			doArthurSawBustMovie = true;
 			break;
 		case kTSA05SinclairZoomIn:
 			GameState.setScoringSawBust5(true);
+			doArthurSawBustMovie = true;
 			break;
 		case kTSA05WhiteZoomIn:
 			GameState.setScoringSawBust6(true);
+			doArthurSawBustMovie = true;
+			break;
+		case kEasterEggJimenez:
+		case kEasterEggCastillo:
+		case kEasterEggSinclair:
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			doArthurSawBustMovie = true;
+			break;
+		case kTSA0AEastRobot:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA48", kArthurTSAClickedRobot1);
+			break;
+		case kTSA0AWestRobot:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA53", kArthurTSAClickedRobot2);
 			break;
 
 		// Command center
@@ -2526,15 +2898,20 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 		case kTSA0BShowGuardRobots:
 			startUpRobotMonitor();
 			// Fall through
+		case kTSA0BRobotsFromCommandCenterToFrontDoor:
+		case kTSA0BRobotsFromReadyRoomToFrontDoor:
+			doArthurRedirectedRobotsMovie = true;
 		case kTSA0BRobotsFromCommandCenterToReadyRoom:
 		case kTSA0BRobotsFromReadyRoomToCommandCenter:
-		case kTSA0BRobotsFromCommandCenterToFrontDoor:
 		case kTSA0BRobotsFromFrontDoorToCommandCenter:
 		case kTSA0BRobotsFromFrontDoorToReadyRoom:
-		case kTSA0BRobotsFromReadyRoomToFrontDoor:
 			_sprite2.setCurrentFrameIndex(kRedirectionSecuredSprite);
 			_sprite2.show();
 			break;
+		case kTSA0BAIInterruption:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA52", kArthurTSAConfinedByBaldwin);
+			break;
 
 		// TBP monitor.
 		case kTSA0BWestZoomIn:
@@ -2548,6 +2925,8 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 			}
 
 			initializeTBPMonitor(kMonitorNeutral, 0);
+			if (GameState.getTSAState() == kTSAPlayerForcedReview && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA55", kArthurTSAOpenTBPMonitor);
 			break;
 		case kTSA0BWestZoomOut:
 			GameState.setTSA0BZoomedIn(false);
@@ -2574,18 +2953,26 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 		case kTSA22RedEastZoomInSequence:
 			_privateFlags.setFlag(kTSAPrivateKeyVaultOpenFlag, true);
 			setCurrentActivation(kActivationKeyVaultOpen);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA50", kArthurTSASawJourneymanKey);
 			break;
 		case kTSA23RedWestVaultZoomInSequence:
 			_privateFlags.setFlag(kTSAPrivateChipVaultOpenFlag, true);
 			setCurrentActivation(kActivationChipVaultOpen);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA54", kArthurTSASawBiochips);
 			break;
 		case kTSA25NorthPutOnSuit:
 			GameState.setTSABiosuitOn(true);
 			GameState.setScoringGotBiosuit(true);
 			// Fall through...
 		case kTSA25NorthAlreadyHaveSuit:
-			requestExtraSequence(kTSA25NorthDescending1, 0, kFilterNoInput);
+			requestExtraSequence(kTSA25NorthDescending1, kExtraCompletedFlag, kFilterNoInput);
+			break;
+		case kTSA25NorthDescending1:
 			requestExtraSequence(kTSA25NorthDescending2, kExtraCompletedFlag, kFilterNoInput);
+			if (GameState.getTSAState() != kTSAPlayerNeedsHistoricalLog && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA04", kArthurTSAUsedTurbolift);
 			break;
 		case kTSA25NorthDescending2:
 			arriveAt(kTSA26, kNorth);
@@ -2745,13 +3132,31 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
 		case kTSA37CongratulationsToExit:
 			GameState.setTSAState(kPlayerFinishedWithTSA);
 			initializePegasusButtons(true);
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA49", kArthurTSASawBaldwinSayGo);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB22", kArthurTSASawBaldwinSayGo);
+			}
 			break;
 		}
+		if (g_arthurChip) {
+			if (doArthurSawBustMovie)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA21", kArthurTSASawBust);
+			else if (doArthurRedirectedRobotsMovie && GameState.getTSAState() == kRobotsAtFrontDoor)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurTSARedirectedRobots);
+		}
 	}
 
 	g_AIArea->checkMiddleArea();
 }
 
+void FullTSA::setAmbienceLevel(const uint16 level) {
+	Neighborhood::setAmbienceLevel(level);
+	if (_entranceMusic.isSoundLoaded())
+		_entranceFader.setMasterVolume(level);
+}
+
 void FullTSA::arriveFromPrehistoric() {
 	if (_vm->playerHasItemID(kHistoricalLog)) {
 		GameState.setScoringFinishedPrehistoric();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.h b/engines/pegasus/neighborhood/tsa/fulltsa.h
index a646d57..8f8bacf 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.h
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.h
@@ -68,6 +68,8 @@ public:
 
 	void checkContinuePoint(const RoomID, const DirectionConstant);
 
+	void setAmbienceLevel(const uint16);
+
 	bool canSolve();
 	void doSolve();
 
@@ -99,9 +101,11 @@ protected:
 	void downButton(const Input &);
 	void startDoorOpenMovie(const TimeValue, const TimeValue);
 	TimeValue getViewTime(const RoomID, const DirectionConstant);
+	void showViewFrame(TimeValue);
 	void findSpotEntry(const RoomID, const DirectionConstant, SpotFlags, SpotTable::Entry &);
 	void turnTo(const DirectionConstant);
 	CanMoveForwardReason canMoveForward(ExitTable::Entry &);
+	void moveForward();
 	CanOpenDoorReason canOpenDoor(DoorTable::Entry &);
 	void bumpIntoWall();
 	void initializeTBPMonitor(const int, const ExtraID);
@@ -109,10 +113,13 @@ protected:
 	void getExtraCompassMove(const ExtraTable::Entry &, FaderMoveSpec &);
 	Hotspot *getItemScreenSpot(Item *, DisplayElement *);
 	void openDoor();
+	void doorOpened();
 	void turnRight();
 	void turnLeft();
 	void closeDoorOffScreen(const RoomID, const DirectionConstant);
+	void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits);
 	void playExtraMovie(const ExtraTable::Entry &, const NotificationFlags, const InputBits interruptionInput);
+	void startTurnPush(const TurnDirection, const TimeValue, const DirectionConstant);
 	void handleInput(const Input &, const Hotspot *);
 	void arriveAtTSA25Red();
 	void startUpComparisonMonitor();
@@ -142,6 +149,15 @@ protected:
 	void checkRobotLocations(const RoomID, const DirectionConstant);
 	void getExtraEntry(const uint32, ExtraTable::Entry &);
 
+	Movie _extraMovie;
+	NotificationCallBack _extraMovieCallBack;
+	Movie _blankMovie;
+
+	Sound _entranceMusic;
+	SoundFader _entranceFader;
+	bool _playedSolvedMusicCue;
+	Sound _solvedMusicCue;
+
 	Sprite _sprite1, _sprite2, _sprite3;
 	FuseFunction _utilityFuse;
 	RipTimer _ripTimer;
diff --git a/engines/pegasus/neighborhood/tsa/tinytsa.cpp b/engines/pegasus/neighborhood/tsa/tinytsa.cpp
index 0326c7f..e703929 100644
--- a/engines/pegasus/neighborhood/tsa/tinytsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/tinytsa.cpp
@@ -28,6 +28,7 @@
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
 #include "pegasus/items/biochips/aichip.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/neighborhood/mars/constants.h"
 #include "pegasus/neighborhood/norad/constants.h"
@@ -179,7 +180,10 @@ Common::String TinyTSA::getEnvScanMovie() {
 }
 
 void TinyTSA::loadAmbientLoops() {
-	loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
+	if (_vm->isDVD()) // Updated sound in the DVD version
+		loadLoopSound1("Sounds/TSA/T01NAE.NEW.32K.AIFF");
+	else
+		loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
 }
 
 int16 TinyTSA::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) {
@@ -385,6 +389,11 @@ void TinyTSA::receiveNotification(Notification *notification, const Notification
 					break;
 				}
 			}
+			if (((GameState.getNoradFinished() && !(GameState.getMarsFinished() || GameState.getWSCFinished())) ||
+				(GameState.getMarsFinished() && !(GameState.getNoradFinished() || GameState.getWSCFinished())) ||
+				(GameState.getWSCFinished() && !(GameState.getNoradFinished() || GameState.getMarsFinished()))) &&
+				g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB43", kArthurTSASawFirstOpMemMovie);			
 
 			requestExtraSequence(kTinyTSA37OpMemReviewToMainMenu, kExtraCompletedFlag, kFilterNoInput);
 			break;
@@ -393,6 +402,8 @@ void TinyTSA::receiveNotification(Notification *notification, const Notification
 			GameState.setTSAState(kPlayerLockedInPegasus);
 			showMainJumpMenu();
 			makeContinuePoint();
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA22", kArthurTSAInPegasusNoVideo);
 			break;
 		case kTinyTSA37JumpToNoradMenu:
 			setCurrentActivation(kActivationTinyTSAJumpToNorad);
diff --git a/engines/pegasus/neighborhood/wsc/wsc.cpp b/engines/pegasus/neighborhood/wsc/wsc.cpp
index 09e2a48..e7e212c 100644
--- a/engines/pegasus/neighborhood/wsc/wsc.cpp
+++ b/engines/pegasus/neighborhood/wsc/wsc.cpp
@@ -23,10 +23,12 @@
  *
  */
 
+#include "pegasus/cursor.h"
 #include "pegasus/energymonitor.h"
 #include "pegasus/gamestate.h"
 #include "pegasus/pegasus.h"
 #include "pegasus/ai/ai_area.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
 #include "pegasus/items/biochips/shieldchip.h"
 #include "pegasus/neighborhood/wsc/wsc.h"
@@ -39,6 +41,12 @@ static const CanTurnReason kCantTurnWatchingDiagnosis = kCantTurnLastReason + 1;
 static const CanTurnReason kCantTurnWatchingAnalysis = kCantTurnWatchingDiagnosis + 1;
 static const CanTurnReason kCantTurnInMoleculeGame = kCantTurnWatchingAnalysis + 1;
 
+static const ExtraID kImplantNoGun = 1000;
+static const ExtraID kImplantWithGun = 1001;
+static const ExtraID kEasterEggWalchek = 1002;
+
+static const HotSpotID kBiotechImplantHotSpotID = 10000;
+
 static const TimeScale kMoleculesMovieScale = 600;
 static const TimeValue kMoleculeLoopTime = 4 * kMoleculesMovieScale;
 static const TimeValue kMoleculeFailTime = 2 * kMoleculesMovieScale;
@@ -473,7 +481,7 @@ static const CoordType kMoleculesMovieLeft = kNavAreaLeft + 112;
 static const CoordType kMoleculesMovieTop = kNavAreaTop + 40;
 
 WSC::WSC(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "WSC", kWSCID),
-		_moleculesMovie(kNoDisplayElement) {
+		_biotechImplantSpot(kBiotechImplantHotSpotID), _extraMovie(kNoDisplayElement), _moleculesMovie(kNoDisplayElement) {
 	setIsItemTaken(kArgonCanister);
 	setIsItemTaken(kSinclairKey);
 	setIsItemTaken(kNitrogenCanister);
@@ -486,6 +494,11 @@ WSC::WSC(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHan
 			GameState.isTakenItemID(kSinclairKey));
 }
 
+WSC::~WSC() {
+	if (_vm->isDVD())
+		_vm->getAllHotspots().remove(&_biotechImplantSpot);
+}
+
 uint16 WSC::getDateResID() const {
 	return kDate2310ID;
 }
@@ -493,12 +506,23 @@ uint16 WSC::getDateResID() const {
 void WSC::init() {
 	Neighborhood::init();
 
+	_extraMovieCallBack.setNotification(&_neighborhoodNotification);
+
 	_cachedZoomSpot = 0;
 	_argonSprite = 0;
 
 	// HACK: Fix the drag item for picking up the Sinclair Key Card
 	HotspotInfoTable::Entry *entry = findHotspotEntry(kWSC02SouthTakeArgonSpotID);
 	entry->hotspotItem = kArgonPickup;
+
+	if (_vm->isDVD()) {
+		Hotspot *aSpot = _vm->getAllHotspots().findHotspotByID(kW61TimeBendingSpotID);
+		aSpot->setArea(Common::Rect(97, 156, 275, 174));
+
+		_biotechImplantSpot.setArea(Common::Rect(kNavAreaLeft + 97, kNavAreaTop + 174, kNavAreaLeft + 275, kNavAreaTop + 182));
+		_biotechImplantSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag);
+		_vm->getAllHotspots().push_back(&_biotechImplantSpot);
+	}
 }
 
 void WSC::flushGameState() {
@@ -1002,27 +1026,27 @@ void WSC::getExtraEntry(const uint32 id, ExtraTable::Entry &extraEntry) {
 		break;
 	case kW61SouthScreenOnWithGun:
 		if (GameState.isTakenItemID(kMachineGun))
-			Neighborhood::getExtraEntry(id, extraEntry);
-		else
 			Neighborhood::getExtraEntry(kW61SouthScreenOnNoGun, extraEntry);
+		else
+			Neighborhood::getExtraEntry(id, extraEntry);
 		break;
 	case kW61SouthSmartAlloysWithGun:
 		if (GameState.isTakenItemID(kMachineGun))
-			Neighborhood::getExtraEntry(id, extraEntry);
-		else
 			Neighborhood::getExtraEntry(kW61SouthSmartAlloysNoGun, extraEntry);
+		else
+			Neighborhood::getExtraEntry(id, extraEntry);
 		break;
 	case kW61SouthMorphingWithGun:
 		if (GameState.isTakenItemID(kMachineGun))
-			Neighborhood::getExtraEntry(id, extraEntry);
-		else
 			Neighborhood::getExtraEntry(kW61SouthMorphingNoGun, extraEntry);
+		else
+			Neighborhood::getExtraEntry(id, extraEntry);
 		break;
 	case kW61SouthTimeBendingWithGun:
 		if (GameState.isTakenItemID(kMachineGun))
-			Neighborhood::getExtraEntry(id, extraEntry);
-		else
 			Neighborhood::getExtraEntry(kW61SouthTimeBendingNoGun, extraEntry);
+		else
+			Neighborhood::getExtraEntry(id, extraEntry);
 		break;
 	case kW98RobotHeadOpensLight:
 		if (GameState.getWSCCatwalkDark())
@@ -1084,6 +1108,21 @@ void WSC::bumpIntoWall() {
 	Neighborhood::bumpIntoWall();
 }
 
+void WSC::spotCompleted() {
+	Neighborhood::spotCompleted();
+	if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kWSC58, kSouth) && g_arthurChip) {
+		g_AIArea->checkRules();
+		if (GameState.isTakenItemID(kCrowbar)) {
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA94", kArthurWSCSawBrokenDoor);
+		} else {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA95", kArthurWSCSawBrokenDoorNoCrowBar);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurWSCSawBrokenDoorNoCrowBar);
+		}
+	}
+}
+
 void WSC::closeDoorOffScreen(const RoomID room, const DirectionConstant) {
 	Item *keyCard;
 
@@ -1130,27 +1169,43 @@ void WSC::cantOpenDoor(CanOpenDoorReason reason) {
 	switch (GameState.getCurrentRoomAndView()) {
 	case MakeRoomView(kWSC22, kWest):
 		playSpotSoundSync(kNakamuraNotHomeIn, kNakamuraNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC23, kEast):
 		playSpotSoundSync(kHernandezNotHomeIn, kHernandezNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC26, kWest):
 		playSpotSoundSync(kGrailisNotHomeIn, kGrailisNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC27, kEast):
 		playSpotSoundSync(kWashingtonNotHomeIn, kWashingtonNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC32, kWest):
 		playSpotSoundSync(kTheriaultNotHomeIn, kTheriaultNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC33, kEast):
 		playSpotSoundSync(kSullivanNotHomeIn, kSullivanNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC41, kWest):
 		playSpotSoundSync(kGlennerNotHomeIn, kGlennerNotHomeOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	case MakeRoomView(kWSC42, kEast):
 		playSpotSoundSync(kSinclairNotHomeIn, kSinclairNotHomeOut);
+		if (!GameState.isTakenItemID(kSinclairKey) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA91", kArthurWSCAttemptedSinclairDoorNoKey);
 		break;
 	case MakeRoomView(kWSC15, kWest):
 	case MakeRoomView(kWSC25, kWest):
@@ -1158,6 +1213,8 @@ void WSC::cantOpenDoor(CanOpenDoorReason reason) {
 	case MakeRoomView(kWSC41, kEast):
 	case MakeRoomView(kWSC46, kWest):
 		playSpotSoundSync(kWSCLabClosedIn, kWSCLabClosedOut);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor);
 		break;
 	default:
 		Neighborhood::cantOpenDoor(reason);
@@ -1294,10 +1351,87 @@ void WSC::zoomTo(const Hotspot *hotspot) {
 }
 
 void WSC::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
-	if (extraID == kW61Brochure)
-		loadLoopSound1("");
+	TimeValue segmentStart = 0, segmentStop = 0;
+	bool loopSequence = false;
+	Common::Rect pushBounds;
+	NotificationFlags extraFlags;
+
+	switch (extraID) {
+	case kImplantNoGun:
+	case kImplantWithGun:
+	case kEasterEggWalchek:
+		_turnPush.getBounds(pushBounds);
+		
+		switch (extraID) {
+		case kImplantNoGun:
+			_extraMovie.initFromMovieFile("Images/World Science Center/W61SNF.movie");
+			break;
+		case kImplantWithGun:
+			_extraMovie.initFromMovieFile("Images/World Science Center/W61SZF.movie");
+			break;
+		case kEasterEggWalchek:
+			_extraMovie.initFromMovieFile("Images/World Science Center/W61WZF.movie");
+			break;
+		default:
+			break;
+		}
+		segmentStart = 0;
+		segmentStop = _extraMovie.getDuration();
+		loopSequence = false;
+		
+		_lastExtra = extraID;
+		_turnPush.hide();
+		
+		if (!loopSequence && g_AIArea)
+			g_AIArea->lockAIOut();
+		
+		extraFlags = flags;
+		_interruptionFilter = interruptionFilter;
+		// Stop the nav movie before doing anything else
+		_navMovie.stop();
+		_navMovie.stopDisplaying();
+		
+		_extraMovie.setVolume(_vm->getSoundFXLevel());
+		_extraMovie.moveElementTo(pushBounds.left, pushBounds.top);
+		_extraMovie.setDisplayOrder(kNavMovieOrder + 1);
+		_extraMovie.startDisplaying();
+		_extraMovie.show();
+		_extraMovie.setFlags(0);
+		_extraMovie.setSegment(segmentStart, segmentStop);
+		_extraMovie.setTime(segmentStart);
+		if (loopSequence)
+			_extraMovie.setFlags(kLoopTimeBase);
+		else
+			extraFlags |= kNeighborhoodMovieCompletedFlag;
+		_extraMovieCallBack.cancelCallBack();
+		_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
+		if (extraFlags != 0) {
+			_extraMovieCallBack.setCallBackFlag(extraFlags);
+			_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
+		}
+		_extraMovie.start();
+		break;
+	default:
+		switch (extraID) {
+		case kW61Brochure:
+			loadLoopSound1("");
+			break;
+		}
+		Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+		if (extraID == kWSCSpinRobot && g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA93", kArthurWSCSawAresHologram);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB08", kArthurWSCSawAresHologram);
+		}
+		break;
+	}
+}
 
-	Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
+void WSC::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) {
+	Neighborhood::startDoorOpenMovie(startTime, stopTime);
+	if (GameState.getCurrentRoomAndView() == MakeRoomView(kWSC58, kSouth) && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurWSCUsedCrowBar);
 }
 
 int16 WSC::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) {
@@ -1371,17 +1505,40 @@ void WSC::loadAmbientLoops() {
 	RoomID room = GameState.getCurrentRoom();
 
 	if (room >= kWSC01 && room <= kWSC04) {
-		if (GameState.getWSCSeenTimeStream())
-			loadLoopSound1("Sounds/World Science Center/WLabLoop.22K.AIFF", 0x100 / 2);
-	} else if ((room >= kWSC06 && room <= kWSC58) || (room >= kWSC62 && room <= kWSC63))
-		loadLoopSound1("Sounds/World Science Center/Organic Walls.22K.AIFF", 0x100 / 2);
-	else if (room >= kWSC82 && room <= kWSC92)
-		loadLoopSound1("Sounds/World Science Center/Creature Feature.22K.AIFF");
-	else if ((room >= kWSC60 && room <= kWSC61West) || (room >= kWSC64 && room <= kWSC81) ||
-			(room >= kWSC93 && room <= kWSC97))
-		loadLoopSound1("Sounds/World Science Center/The Other Side.22K.AIFF", 0x100 / 12);
-	else if (room == kWSC98)
-		loadLoopSound1("Sounds/World Science Center/WCatLoop.22K.AIFF");
+		if (GameState.getWSCSeenTimeStream()) {
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/World Science Center/WLabLoop.32K.AIFF", 0x100 / 4);
+			else
+				loadLoopSound1("Sounds/World Science Center/WLabLoop.22K.AIFF", 0x100 / 2);
+			if (_vm->isDVD()) {
+				if (GameState.getWSCPoisoned())
+					loadLoopSound2("Sounds/World Science Center/Poisoned.32K.16.AIFF", 0x100 / 4);
+				else
+					loadLoopSound2("");
+			}
+		}
+	} else {
+		if ((room >= kWSC06 && room <= kWSC58) || (room >= kWSC62 && room <= kWSC63)) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/World Science Center/Organic Walls.32K.16.AIFF", 205); // ~80%
+			else
+				loadLoopSound1("Sounds/World Science Center/Organic Walls.22K.AIFF", 0x100 / 2);
+		} else if (room >= kWSC82 && room <= kWSC92) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/World Science Center/Creature Feature.32K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/World Science Center/Creature Feature.22K.AIFF");
+		} else if ((room >= kWSC60 && room <= kWSC61West) || (room >= kWSC64 && room <= kWSC81) ||
+					(room >= kWSC93 && room <= kWSC97)) {
+			if (_vm->isDVD()) // Updated for the DVD version
+				loadLoopSound1("Sounds/World Science Center/The Other Side.32K.16.AIFF", 51); // ~20%
+			else
+				loadLoopSound1("Sounds/World Science Center/The Other Side.22K.AIFF", 0x100 / 12);
+		} else if (room == kWSC98) {
+			loadLoopSound1("Sounds/World Science Center/WCatLoop.22K.AIFF");
+		}
+		loadLoopSound2("");
+	}
 }
 
 void WSC::checkContinuePoint(const RoomID room, const DirectionConstant direction) {
@@ -1498,12 +1655,21 @@ void WSC::arriveAt(const RoomID room, const DirectionConstant dir) {
 		if (GameState.getWSCDesignedAntidote() && !GameState.getWSCPickedUpAntidote())
 			setCurrentActivation(kActivationReadyForSynthesis);
 		break;
+	case MakeRoomView(kWSC19, kWest):
+		if (!(GameState.isTakenItemID(kSinclairKey) && GameState.isTakenItemID(kArgonCanister) &&
+			GameState.isTakenItemID(kNitrogenCanister)) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurWSCLeftLabNoKeyOrCanisters);
+		break;
 	case MakeRoomView(kWSC16, kNorth):
 		if (getCurrentAlternate() == kAltWSCPeopleAtW19North) {
 			setCurrentAlternate(kAltWSCNormal);
 			_privateFlags.setFlag(kWSCPrivateSeenPeopleAt19NorthFlag, true);
 		}
 		break;
+	case MakeRoomView(kWSC06, kNorth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurWSCAtOppositeDoor);
+		break;
 	case MakeRoomView(kWSC07, kSouth):
 	case MakeRoomView(kWSC56, kNorth):
 		setCurrentActivation(kActivationReadyForMap);
@@ -1514,6 +1680,12 @@ void WSC::arriveAt(const RoomID room, const DirectionConstant dir) {
 	case MakeRoomView(kWSC42, kEast):
 		_privateFlags.setFlag(kWSCPrivateSinclairOfficeOpenFlag, false);
 		setCurrentActivation(kActivationSinclairOfficeLocked);
+		if (g_arthurChip) {
+			if (GameState.isTakenItemID(kSinclairKey))
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA99", kArthurWSCSawSinclairDoor);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawSinclairDoorNoKey);
+		}
 		break;
 	case MakeRoomView(kWSC58, kSouth):
 		setCurrentActivation(kActivationW58SouthDoorLocked);
@@ -1522,8 +1694,14 @@ void WSC::arriveAt(const RoomID room, const DirectionConstant dir) {
 	case MakeRoomView(kWSC60, kEast):
 		GameState.setScoringEnteredSinclairOffice();
 		break;
+	case MakeRoomView(kWSC60East, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB03", kArthurWSCZoomedToSnake);
+		break;
 	case MakeRoomView(kWSC61West, kWest):
 		setCurrentActivation(kActivationW61MessagesOff);
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB00", kArthurWSCZoomedToSinclairMessages);
 		break;
 	case MakeRoomView(kWSC61South, kSouth):
 		setCurrentActivation(kActivationW61SouthOff);
@@ -1531,12 +1709,21 @@ void WSC::arriveAt(const RoomID room, const DirectionConstant dir) {
 	case MakeRoomView(kWSC62, kSouth):
 		if (!GameState.getWSCDidPlasmaDodge()) {
 			g_AIArea->lockAIOut();
-			loadLoopSound1("Sounds/World Science Center/Plasma Rock.22K.AIFF");
+
+			if (_vm->isDVD())
+				loadLoopSound1("Sounds/World Science Center/Plasma Rock.44K.16.AIFF");
+			else
+				loadLoopSound1("Sounds/World Science Center/Plasma Rock.22K.AIFF");
+
 			requestExtraSequence(kW62SouthPlasmaRobotAppears, 0, kFilterNoInput);
 			requestExtraSequence(kW62ZoomToRobot, 0, kFilterNoInput);
 			requestExtraSequence(kW62ZoomOutFromRobot, kExtraCompletedFlag, kFilterNoInput);
 		}
 		break;
+	case MakeRoomView(kWSC64, kSouth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB06", kArthurWSCEnteredAuditorium);
+		break;
 	case MakeRoomView(kWSC65Screen, kSouth):
 		if (!GameState.getWSCSeenSinclairLecture()) {
 			GameState.setWSCSeenSinclairLecture(true);
@@ -1562,11 +1749,33 @@ void WSC::arriveAt(const RoomID room, const DirectionConstant dir) {
 		if (getCurrentAlternate() == kAltWSCW0ZDoorOpen)
 			turnLeft();
 		break;
+	case MakeRoomView(kWSC82, kSouth):
+	case MakeRoomView(kWSC82, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB05", kArthurWSCEnteredPassage);
+		break;
+	case MakeRoomView(kWSC90, kEast):
+	case MakeRoomView(kWSC91, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA90", kArthurWSCInPassage);
+		break;
 	case MakeRoomView(kWSC93, kEast):
 		GameState.setWSCBeenAtWSC93(true);
+	case MakeRoomView(kWSC93, kNorth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA38", kArthurWSCExitedPassage);
+		break;
+	case MakeRoomView(kWSC95, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawCatwalkDoor);
 		break;
 	case MakeRoomView(kWSC98, kWest):
 		if (!GameState.getWSCRobotDead()) {
+			if (_vm->isDVD()) {
+				_welcomeSound.initFromAIFFFile("Sounds/World Science Center/Welcome Enrique.22K.AIFF");
+				_welcomeSound.setVolume(_vm->getSoundFXLevel());
+				_welcomeSound.playSound();
+			}
 			scheduleEvent(kGawkAtRobotTime2, 1, kTimerEventPlayerGawkingAtRobot2);
 			setCurrentActivation(kActivationRobotTurning);
 			if (g_AIArea)
@@ -1609,6 +1818,10 @@ void WSC::turnTo(const DirectionConstant direction) {
 		if (GameState.getWSCDesignedAntidote() && !GameState.getWSCPickedUpAntidote())
 			setCurrentActivation(kActivationReadyForSynthesis);
 		break;
+	case MakeRoomView(kWSC06, kNorth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurWSCAtOppositeDoor);
+		break;
 	case MakeRoomView(kWSC07, kSouth):
 	case MakeRoomView(kWSC56, kNorth):
 		setCurrentActivation(kActivationReadyForMap);
@@ -1631,11 +1844,21 @@ void WSC::turnTo(const DirectionConstant direction) {
 	case MakeRoomView(kWSC42, kEast):
 		_privateFlags.setFlag(kWSCPrivateSinclairOfficeOpenFlag, false);
 		setCurrentActivation(kActivationSinclairOfficeLocked);
+		if (GameState.getCurrentRoom() == kWSC42 && g_arthurChip) {
+			if (GameState.isTakenItemID(kSinclairKey))
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA99", kArthurWSCSawSinclairDoor);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawSinclairDoorNoKey);
+		}
 		break;
 	case MakeRoomView(kWSC58, kSouth):
 		setCurrentActivation(kActivationW58SouthDoorLocked);
 		_privateFlags.setFlag(kWSCPrivate58SouthOpenFlag, false);
 		break;
+	case MakeRoomView(kWSC64, kSouth):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB06", kArthurWSCEnteredAuditorium);
+		break;
 	case MakeRoomView(kWSC73, kWest):
 		setCurrentAlternate(kAltWSCNormal);
 		break;
@@ -1643,6 +1866,15 @@ void WSC::turnTo(const DirectionConstant direction) {
 		if (getCurrentAlternate() == kAltWSCW0ZDoorOpen)
 			startExtraSequence(kW0ZSpottedByWomen, kExtraCompletedFlag, kFilterNoInput);
 		break;
+	case MakeRoomView(kWSC82, kSouth):
+	case MakeRoomView(kWSC82, kEast):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB05", kArthurWSCEnteredPassage);
+		break;
+	case MakeRoomView(kWSC95, kWest):
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawCatwalkDoor);
+		break;
 	}
 
 	checkPeopleCrossing();
@@ -1664,6 +1896,7 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			setCurrentActivation(kActivationShotByRobot);
 			GameState.setWSCPoisoned(true);
 			setUpPoison();
+			loadAmbientLoops();
 			makeContinuePoint();
 			break;
 		case kWSCDartScan2:
@@ -1671,14 +1904,18 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			GameState.setScoringRemovedDart();
 			GameState.setWSCRemovedDart(true);
 			setUpPoison();
-			g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XW1WB2", false, kHintInterruption);
-			// Fall through...
-		case kWSCDartScanNo:
+			if (g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XW1WB2", false, kHintInterruption);
 			GameState.setWSCAnsweredAboutDart(true);
 			startExtraSequence(kWSCDartScan3, kExtraCompletedFlag, kFilterNoInput);
 			break;
 		case kWSCDartScan3:
 			setCurrentActivation(kActivateHotSpotAlways);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB02", kArthurWSCRemovedDart);
+			break;
+		case kWSCDartScanNo:
+			die(kDeathDidntStopPoison);
 			break;
 		case kWSCAnalyzerPowerUp:
 		case kWSCAnalyzerPowerUpWithDart:
@@ -1712,10 +1949,18 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			break;
 		case kWSC02TurnOnMorphScreen:
 			setCurrentActivation(kActivationReadyForMorph);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurWSCLookAtMorphExperiment);
 			break;
 		case kWSC02DropToMorphExperiment:
 			loopExtraSequence(kWSC02MorphLoop, kExtraCompletedFlag);
 			setCurrentActivation(kActivationMorphLooping);
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA97", kArthurWSCStartMorphExperiment);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB04", kArthurWSCStartMorphExperiment);
+			}
 			break;
 		case kWSC02MorphLoop:
 			if (_privateFlags.getFlag(kWSCPrivateInterruptedMorphFlag))
@@ -1730,6 +1975,8 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 		case kWSC02TurnOffMorphScreen:
 			setCurrentActivation(kActivationMorphScreenOff);
 			GameState.setWSCSawMorph(true);
+			if (!(GameState.isTakenItemID(kSinclairKey) && GameState.isTakenItemID(kArgonCanister)) && g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA96", kArthurWSCSawMorphExperiment);
 			break;
 		case kW03NorthActivate:
 			if (GameState.getWSCAnalyzedDart() && !GameState.getWSCDesignedAntidote())
@@ -1755,6 +2002,8 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			_privateFlags.setFlag(kWSCPrivateInMoleculeGameFlag, false);
 			GameState.setWSCDesignedAntidote(true);
 			GameState.setScoringBuiltAntidote();
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurWSCDesignedAntidote);
 			break;
 		case kW03SouthCreateAntidote:
 			setCurrentActivation(kActivationSynthesizerLooping);
@@ -1767,9 +2016,13 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 		case kWSC56SouthMap:
 			setCurrentActivation(kActivateHotSpotAlways);
 			GameState.setScoringSawWSCDirectory();
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurWSCReadyForMap);
 			break;
 		case kNerdAtTheDoor1:
 			GameState.setWSCSeenNerd(true);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA28", kArthurWSCSeenNerd);
 			break;
 		case kNerdAtTheDoor2:
 			die(kDeathArrestedInWSC);
@@ -1790,6 +2043,13 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 		case kW61SouthTimeBendingNoGun:
 			GameState.setScoringSawSinclairEntry3();
 			break;
+		case kImplantWithGun:
+		case kImplantNoGun:
+		case kEasterEggWalchek:
+			_extraMovie.stopDisplaying();
+			_extraMovie.releaseMovie();
+			_navMovie.startDisplaying();
+			break;
 		case kW61MessagesOn:
 			GameState.setWSCOfficeMessagesOpen(true);
 			setCurrentActivation(kActivationW61MessagesOn);
@@ -1806,6 +2066,8 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 		case kW61SouthScreenOnNoGun:
 			_privateFlags.setFlag(kWSCPrivateOfficeLogOpenFlag, true);
 			setCurrentActivation(kActivationW61SouthOn);
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA89", kArthurWSCActivatedComputer);
 			break;
 		case kW61SouthScreenOffWithGun:
 		case kW61SouthScreenOffNoGun:
@@ -1819,7 +2081,6 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 		case kW62ZoomOutFromRobot:
 			// Handle action queue before starting new movie sequences.
 			Neighborhood::receiveNotification(notification, flags);
-			_energyDrainRate = g_energyMonitor->getEnergyDrainRate();
 			g_energyMonitor->setEnergyDrainRate(0);
 			currentEnergy = g_energyMonitor->getCurrentEnergy();
 			_vm->setEnergyDeathReason(kDeathHitByPlasma);
@@ -1847,12 +2108,22 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 				g_energyMonitor->drainEnergy(kPlasmaEnergyNoShield);
 			}
 
-			g_energyMonitor->setEnergyDrainRate(_energyDrainRate);
+			setUpPoison();
 			g_AIArea->unlockAI();
 			GameState.setScoringFinishedPlasmaDodge();
 			GameState.setWSCDidPlasmaDodge(true);
 			restoreStriding(kWSC58, kSouth, kAltWSCNormal);
 			loadAmbientLoops();
+			if (g_arthurChip) {
+				if (_vm->getRandomBit())
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA11", kArthurWSCDidPlasmaDodge);
+				else
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB07", kArthurWSCDidPlasmaDodge);
+			}
+			break;
+		case kW65SouthSinclairLecture:
+			if (g_arthurChip)
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurWSCSawSinclairLecture);
 			break;
 		case kW0ZSpottedByWomen:
 			die(kDeathArrestedInWSC);
@@ -1916,8 +2187,9 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			GameState.setWSCRobotDead(true);
 			GameState.setScoringStoppedWSCRobot();
 
-			// Video is not present
-			//g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption);
+			// Video is erroneously not present in the CD version
+			if (_vm->isDVD() && g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption);
 			break;
 		case kW98RobotGassed:
 			item = (Item *)_vm->getAllItems().findItemByID(kArgonCanister);
@@ -1926,21 +2198,45 @@ void WSC::receiveNotification(Notification *notification, const NotificationFlag
 			GameState.setWSCRobotDead(true);
 			GameState.setScoringStoppedWSCRobot();
 
-			// Video is not present
-			//g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption);
+			// Video is erroneously not present in the CD version
+			if (_vm->isDVD() && g_AIArea->isChattyAI())
+				g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption);
 			break;
 		case kW98RobotHeadOpensLight:
 		case kW98RobotHeadOpensDark:
 			setCurrentActivation(kActivationWSCRobotHeadOpen);
 			_privateFlags.setFlag(kWSCPrivateRobotHeadOpenFlag, true);
+			if (g_arthurChip) {
+				switch (_vm->getRandomNumber(2)) {
+				case 0:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurWSCRobotHeadOpen);
+					break;
+				case 1:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurWSCRobotHeadOpen);
+					break;
+				case 2:
+					g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurWSCRobotHeadOpen);
+					break;
+				}
+			}			
 			break;
 		case kW98RobotHeadClosesDark:
 		case kW98RobotHeadClosesLight:
 			setCurrentActivation(kActivationRobotGone);
 			_privateFlags.setFlag(kWSCPrivateRobotHeadOpenFlag, false);
 			GameState.setWSCRobotGone(true);
+			if (GameState.isTakenItemID(kStunGun)) {
+				GameState.setWSCFinished(true);
+
+				if (!GameState.getWSCCatwalkDark())
+					GameState.setScoringWSCGandhi();
+
+				recallToTSASuccess();
+			}
 			break;
 		}
+		if ((_lastExtra == kW61WalchekEasterEgg1 || _lastExtra == kEasterEggWalchek) && g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA09", kArthurWSCPlayedEasterEggMessage);
 	}
 
 	Neighborhood::receiveNotification(notification, flags);
@@ -2007,6 +2303,8 @@ void WSC::startMoleculeGameLevel() {
 	}
 
 	_moleculesMovie.start();
+	if (_moleculeGameLevel == 3 && g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA90", kArthurWSCPoisonedDuringGame);
 }
 
 void WSC::moleculeGameClick(const HotSpotID id) {
@@ -2083,6 +2381,8 @@ void WSC::moleculeGameClick(const HotSpotID id) {
 
 		_moleculesMovie.stop();
 		startMoleculeGameLevel();
+		if (g_arthurChip)
+			g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB38", kArthurWSCFailedMolecule);		
 	}
 }
 
@@ -2126,27 +2426,44 @@ void WSC::activateOneHotspot(HotspotInfoTable::Entry &entry, Hotspot *hotspot) {
 }
 
 void WSC::activateHotspots() {
+	Input input;
+
 	Neighborhood::activateHotspots();
 
-	if (GameState.getCurrentRoomAndView() == MakeRoomView(kWSC98, kWest) && _privateFlags.getFlag(kWSCPrivateRobotHeadOpenFlag)) {
-		if (_privateFlags.getFlag(kWSCPrivateGotRetScanChipFlag))
-			_vm->getAllHotspots().deactivateOneHotspot(kW98RetinalChipSpotID);
-		else
-			_vm->getAllHotspots().activateOneHotspot(kW98RetinalChipSpotID);
+	switch (GameState.getCurrentRoomAndView()) {
+	case MakeRoomView(kWSC61South, kSouth):
+		if (_vm->isDVD()) {
+			InputDevice.getInput(input, kFilterAllInput);
+			if (_privateFlags.getFlag(kWSCPrivateOfficeLogOpenFlag) &&
+				JMPPPInput::isEasterEggModifierInput(input))
+				_vm->getAllHotspots().activateOneHotspot(kBiotechImplantHotSpotID);
+		}
+		break;
+	case MakeRoomView(kWSC98, kWest):
+		if (_privateFlags.getFlag(kWSCPrivateRobotHeadOpenFlag)) {
+			if (_privateFlags.getFlag(kWSCPrivateGotRetScanChipFlag))
+				_vm->getAllHotspots().deactivateOneHotspot(kW98RetinalChipSpotID);
+			else
+				_vm->getAllHotspots().activateOneHotspot(kW98RetinalChipSpotID);
 
-		if (_privateFlags.getFlag(kWSCPrivateGotMapChipFlag))
-			_vm->getAllHotspots().deactivateOneHotspot(kW98MapChipSpotID);
-		else
-			_vm->getAllHotspots().activateOneHotspot(kW98MapChipSpotID);
+			if (_privateFlags.getFlag(kWSCPrivateGotMapChipFlag))
+				_vm->getAllHotspots().deactivateOneHotspot(kW98MapChipSpotID);
+			else
+				_vm->getAllHotspots().activateOneHotspot(kW98MapChipSpotID);
 
-		if (_privateFlags.getFlag(kWSCPrivateGotOpticalChipFlag))
-			_vm->getAllHotspots().deactivateOneHotspot(kW98OpticalChipSpotID);
-		else
-			_vm->getAllHotspots().activateOneHotspot(kW98OpticalChipSpotID);
+			if (_privateFlags.getFlag(kWSCPrivateGotOpticalChipFlag))
+				_vm->getAllHotspots().deactivateOneHotspot(kW98OpticalChipSpotID);
+			else
+				_vm->getAllHotspots().activateOneHotspot(kW98OpticalChipSpotID);
+		}
+		break;
 	}
 }
 
 void WSC::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
+	Movie movie(kNoDisplayElement);
+	Input movieInput;
+
 	if (JMPPPInput::isEasterEggModifierInput(input))
 		GameState.setEasterEgg(true);
 
@@ -2192,6 +2509,18 @@ void WSC::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
 
 			_privateFlags.setFlag(kWSCPrivateClickedCatwalkCableFlag, true);
 			break;
+		case kBiotechImplantHotSpotID:
+			if (GameState.isTakenItemID(kMachineGun))
+				startExtraSequence(kImplantNoGun, kExtraCompletedFlag, kFilterNoInput);
+			else
+				startExtraSequence(kImplantWithGun, kExtraCompletedFlag, kFilterNoInput);
+			break;
+		case kW61WalchekMessageSpotID:
+			if (_vm->isDVD() && GameState.getEasterEgg() && _vm->getRandomBit())
+				startExtraSequence(kEasterEggWalchek, kExtraCompletedFlag, kFilterNoInput);
+			else
+				Neighborhood::clickInHotspot(input, clickedSpot);
+			break;
 		default:
 			Neighborhood::clickInHotspot(input, clickedSpot);
 			break;
@@ -2343,12 +2672,21 @@ void WSC::pickedUpItem(Item *item) {
 		_privateFlags.setFlag(kWSCDraggingAntidoteFlag, false);
 		playSpotSoundSync(kDrinkAntidoteIn, kDrinkAntidoteOut);
 		setUpPoison();
+		loadAmbientLoops();
 
 		if (!GameState.getWSCPickedUpAntidote()) {
 			GameState.setWSCPickedUpAntidote(true);
 			startExtraSequence(kW03SouthDeactivate, kExtraCompletedFlag, kFilterNoInput);
 		}
 		break;
+	case kMachineGun:
+		if (g_arthurChip) {
+			if (_vm->getRandomBit())
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB01", kArthurWSCGotMachineGun);
+			else
+				g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB09", kArthurWSCGotMachineGun);
+		}
+		break;
 	case kArgonPickup:
 		_vm->removeItemFromInventory((InventoryItem *)item);
 		item = (Item *)_vm->getAllItems().findItemByID(kArgonCanister);
diff --git a/engines/pegasus/neighborhood/wsc/wsc.h b/engines/pegasus/neighborhood/wsc/wsc.h
index d9634b3..8685115 100644
--- a/engines/pegasus/neighborhood/wsc/wsc.h
+++ b/engines/pegasus/neighborhood/wsc/wsc.h
@@ -42,7 +42,7 @@ static const RoomID kWSC62 = 62;
 class WSC : public Neighborhood {
 public:
 	WSC(InputHandler *, PegasusEngine *);
-	virtual ~WSC() {}
+	virtual ~WSC();
 
 	void flushGameState();
 
@@ -126,6 +126,7 @@ protected:
 	void pickedUpItem(Item *);
 	void doorOpened();
 	void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits);
+	void startDoorOpenMovie(const TimeValue, const TimeValue);
 	void getExtraEntry(const uint32, ExtraTable::Entry &);
 	void takeItemFromRoom(Item *item);
 	void checkPeopleCrossing();
@@ -137,6 +138,7 @@ protected:
 	void getExitCompassMove(const ExitTable::Entry &exitEntry, FaderMoveSpec &compassMove);
 	void getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec &compassMove);
 	void bumpIntoWall();
+	void spotCompleted();
 	void activateHotspots();
 	void setUpAIRules();
 	Common::String getBriefingMovie();
@@ -153,12 +155,15 @@ protected:
 
 	FlagsArray<byte, kNumWSCPrivateFlags> _privateFlags;
 	const Hotspot *_cachedZoomSpot;
+	Hotspot _biotechImplantSpot;
+	Movie _extraMovie;
+	NotificationCallBack _extraMovieCallBack;
 	MoleculeBin _moleculeBin;
 	int32 _moleculeGameLevel, _numCorrect;
 	Movie _moleculesMovie;
 	uint32 _levelArray[6];
-	Common::Rational _energyDrainRate;
 	Sprite *_argonSprite;
+	Sound _welcomeSound;
 };
 
 } // End of namespace Pegasus
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index c5edd34..e50dd7e 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -23,6 +23,10 @@
  *
  */
 
+#ifdef MACOSX
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#endif
+
 #include "common/config-manager.h"
 #include "common/error.h"
 #include "common/events.h"
@@ -52,6 +56,7 @@
 #include "pegasus/ai/ai_area.h"
 #include "pegasus/items/itemlist.h"
 #include "pegasus/items/biochips/aichip.h"
+#include "pegasus/items/biochips/arthurchip.h"
 #include "pegasus/items/biochips/biochipitem.h"
 #include "pegasus/items/biochips/mapchip.h"
 #include "pegasus/items/biochips/opticalchip.h"
@@ -73,6 +78,10 @@
 #include "pegasus/neighborhood/tsa/tinytsa.h"
 #include "pegasus/neighborhood/wsc/wsc.h"
 
+#ifdef MACOSX
+#include <CoreServices/CoreServices.h>
+#endif
+
 namespace Pegasus {
 
 PegasusEngine::PegasusEngine(OSystem *syst, const PegasusGameDescription *gamedesc) : Engine(syst), InputHandler(0), _gameDescription(gamedesc),
@@ -93,7 +102,9 @@ PegasusEngine::PegasusEngine(OSystem *syst, const PegasusGameDescription *gamede
 	_idlerHead = 0;
 	_currentCD = 1;
 	_introTimer = 0;
+	_toggleRequested = false;
 	_aiSaveStream = 0;
+	_heardOverviewVoice = false;
 }
 
 PegasusEngine::~PegasusEngine() {
@@ -261,9 +272,13 @@ void PegasusEngine::createItems() {
 void PegasusEngine::createItem(ItemID itemID, NeighborhoodID neighborhoodID, RoomID roomID, DirectionConstant direction) {
 	switch (itemID) {
 	case kInterfaceBiochip:
-		// Unused in game, but still in the data and we need to create
-		// it because it's saved/loaded from save files.
-		new BiochipItem(itemID, neighborhoodID, roomID, direction);
+		if (isDVD()) {
+			new ArthurChip(itemID, neighborhoodID, roomID, direction);
+		} else {
+			// Unused in game, but still in the data and we need to create
+			// it because it's saved/loaded from save files.
+			new BiochipItem(itemID, neighborhoodID, roomID, direction);
+		}
 		break;
 	case kAIBiochip:
 		new AIChip(itemID, neighborhoodID, roomID, direction);
@@ -332,10 +347,23 @@ void PegasusEngine::runIntro() {
 	if (shouldQuit() || skipped)
 		return;
 
+#ifdef USE_THEORADEC
+	if (isDVD() && Common::File::exists(_introDirectory + "/BigMovie_hq.ogg")) {
+		Video::TheoraDecoder hqVideo(Audio::Mixer::kPlainSoundType);
+
+		if (hqVideo.loadFile(_introDirectory + "/BigMovie_hq.ogg")) {
+			hqVideo.start();
+			playMovieScaled(&hqVideo, 0, 0);
+			return;
+		}
+	}
+#endif
+
 	video = new Video::QuickTimeDecoder();
 
 	if (!video->loadFile(_introDirectory + "/Big Movie.movie"))
-		error("Could not load intro movie");
+		if (!video->loadFile(_introDirectory + "/BigMovie.movie"))
+			error("Could not load intro movie");
 
 	video->seek(Audio::Timestamp(0, 10 * 600, 600));
 	video->start();
@@ -553,7 +581,14 @@ bool PegasusEngine::loadFromStream(Common::SeekableReadStream *stream) {
 		}
 	}
 
+	if (isDVD()) {
+		Arthur.resetArthurState();
+		_screenDimmer.hide();
+		_screenDimmer.stopDisplaying();
+	}
 	startNeighborhood();
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB24", kArthurLoadedSavedGame);
 
 	// Make a new continue point if this isn't already one
 	if (saveType == kNormalSave)
@@ -716,6 +751,27 @@ Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc)
 	bool valid = writeToStream(saveFile, kNormalSave);
 	delete saveFile;
 
+#ifdef MACOSX
+	// HACK HACK HACK HACK: Beyond horrible hack
+	// clone2727 just died on the inside
+	if (!valid)
+		return Common::kUnknownError;
+
+	Common::String savePath = ConfMan.get("savepath");
+	Common::String filePath = savePath + "/" + output;
+
+	FSCatalogInfo catInfo;
+	FSRef ref;
+
+	if (!FSPathMakeRef((const UInt8 *)filePath.c_str(), &ref, false)) {
+		FSGetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catInfo, 0, 0, 0);
+		FileInfo *info = (FileInfo *)catInfo.finderInfo;
+		info->fileCreator = kPegasusPrimeCreator;
+		info->fileType = kPegasusPrimeDisk1GameType + _currentCD - 1;
+		FSSetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catInfo);
+	}
+#endif
+
 	return valid ? Common::kNoError : Common::kUnknownError;
 }
 
@@ -788,9 +844,24 @@ void PegasusEngine::introTimerExpired() {
 
 		bool skipped = false;
 
-		Video::VideoDecoder *video = new Video::QuickTimeDecoder();
-		if (!video->loadFile(_introDirectory + "/LilMovie.movie"))
-			error("Failed to load little movie");
+		Video::VideoDecoder *video = 0;
+
+#ifdef USE_THEORADEC
+		if (isDVD()) {
+			video = new Video::TheoraDecoder();
+
+			if (!video->loadFile(_introDirectory + "/LilMovie_hq.ogg")) {
+				delete video;
+				video = 0;
+			}
+		}
+#endif
+
+		if (!video) {
+			video = new Video::QuickTimeDecoder();
+			if (!video->loadFile(_introDirectory + "/LilMovie.movie"))
+				error("Failed to load little movie");
+		}
 
 		bool saveAllowed = swapSaveAllowed(false);
 		bool openAllowed = swapLoadAllowed(false);
@@ -885,6 +956,7 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) {
 			_gfx->doFadeOutSync();
 			useMenu(new CreditsMenu());
 			_gfx->updateDisplay();
+			((CreditsMenu *)_gameMenu)->startCreditsMenuLoop();
 			_gfx->doFadeInSync();
 		}
 		break;
@@ -929,31 +1001,98 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) {
 				_gfx->updateDisplay();
 				_gfx->doFadeInSync();
 			} else {
+				Input input;
+				if (isDVD()) {
+					InputDevice.getInput(input, kFilterAllInput);
+					if (JMPPPInput::isEasterEggModifierInput(input))
+						GameState.setEasterEgg(true);
+				}
+
 				_gfx->doFadeOutSync();
 				useMenu(0);
 				_gfx->clearScreen();
 				_gfx->updateDisplay();
 
-				Video::VideoDecoder *video = new Video::QuickTimeDecoder();
-				if (!video->loadFile(_introDirectory + "/Closing.movie"))
-					error("Could not load closing movie");
+				Video::VideoDecoder *video = 0;
+				if (GameState.getEasterEgg()) {
+#ifdef USE_THEORADEC
+					video = new Video::TheoraDecoder();
+					if (!video->loadFile(_introDirectory + "/Closing_hq2.ogg")) {
+						delete video;
+						video = 0;
+					}
+#endif
+					if (!video) {
+						video = new Video::QuickTimeDecoder();
+						if (!video->loadFile(_introDirectory + "/Closing2.movie"))
+							error("Could not load alternate closing movie");
+					}
+				} else {
+#ifdef USE_THEORADEC
+					video = new Video::TheoraDecoder();
+					if (!video->loadFile(_introDirectory + "/Closing_hq1.ogg")) {
+						delete video;
+						video = 0;
+					}
+#endif
+					if (!video) {
+						video = new Video::QuickTimeDecoder();
+						if (!video->loadFile(_introDirectory + "/Closing.movie"))
+							error("Could not load closing movie");
+					}
+				}
 
-				uint16 x = (640 - video->getWidth() * 2) / 2;
-				uint16 y = (480 - video->getHeight() * 2) / 2;
+				uint16 newHeight = (uint16)((640.0f / (float)video->getWidth()) * (float)video->getHeight());
+				uint16 x = 0;
+				uint16 y = (480 - newHeight) / 2;
 
 				video->start();
-				playMovieScaled(video, x, y);
+				bool interrupted = playMovieScaled(video, x, y);
 
 				delete video;
 
+				if (isDVD() && !interrupted) {
+					// Display new post credits movie
+#ifdef USE_THEORADEC
+					video = new Video::TheoraDecoder();
+					if (!video->loadFile(_introDirectory + "/Closing_hq3.ogg")) {
+						delete video;
+						video = 0;
+					}
+#endif
+					if (!video) {
+						video = new Video::QuickTimeDecoder();
+						if (!video->loadFile(_introDirectory + "/Closing3.movie"))
+							error("Could not load closing 3 movie");
+					}
+
+					video->start();
+					interrupted = playMovieScaled(video, 0, 0);
+					delete video;
+				}
+
 				if (shouldQuit())
 					return;
 
-				useMenu(new MainMenu());
-				_gfx->updateDisplay();
-				((MainMenu *)_gameMenu)->startMainMenuLoop();
-				_gfx->doFadeInSync();
-				resetIntroTimer();
+				if (isDVD()) {
+					useMenu(new CreditsMenu());
+					_gfx->updateDisplay();
+					((CreditsMenu *)_gameMenu)->startCreditsMenuLoop();
+					if (!interrupted)
+						_gfx->doFadeInSync();
+					else
+						_gfx->enableUpdates();
+				} else {
+					useMenu(new MainMenu());
+					_gfx->updateDisplay();
+					((MainMenu *)_gameMenu)->startMainMenuLoop();
+					if (!interrupted)
+						_gfx->doFadeInSync();
+					else
+						_gfx->enableUpdates();
+					resetIntroTimer();
+				}
+				GameState.setEasterEgg(false);
 			}
 		} else {
 			loadFromContinuePoint();
@@ -1081,6 +1220,8 @@ void PegasusEngine::doInterfaceOverview() {
 		Common::Rect(542, 36, 542 + 58, 36 + 20)
 	};
 
+	static const Common::Rect hiddenSpot = Common::Rect(595, 417, 595 + 4, 417 + 5);
+
 	_gfx->doFadeOutSync();
 	useMenu(0);
 
@@ -1119,7 +1260,18 @@ void PegasusEngine::doInterfaceOverview() {
 	controllerHighlight.startDisplaying();
 
 	Movie overviewText(kNoDisplayElement);
-	overviewText.initFromMovieFile("Images/Interface/Overview Mac.movie");
+
+	if (isDVD()) {
+		if (isLinux() && Common::File::exists("Images/Interface/Overview Linux.movie"))
+			overviewText.initFromMovieFile("Images/Interface/Overview Linux.movie");
+		else if (isLinux() || isWindows())
+			overviewText.initFromMovieFile("Images/Interface/Overview PC.movie");
+		else
+			overviewText.initFromMovieFile("Images/Interface/Overview ScummVM.movie");
+	} else {
+		overviewText.initFromMovieFile("Images/Interface/Overview Mac.movie");
+	}
+
 	overviewText.setDisplayOrder(0);
 	overviewText.moveElementTo(kNavAreaLeft, kNavAreaTop);
 	overviewText.startDisplaying();
@@ -1155,6 +1307,10 @@ void PegasusEngine::doInterfaceOverview() {
 	if (time == 2) {
 		highlight.hide();
 		controllerHighlight.show();
+
+		// Hidden message in the DVD version
+		if (isDVD() && hiddenSpot.contains(cursorLoc))
+			time = 12;
 	} else if (i != kNumOverviewSpots) {
 		controllerHighlight.hide();
 		Common::Rect r = overviewSpots[i];
@@ -1175,6 +1331,26 @@ void PegasusEngine::doInterfaceOverview() {
 	_gfx->updateDisplay();
 	_gfx->doFadeInSync();
 
+	Sound overviewVoice, overviewMusic;
+	SoundFader overviewMusicFader;
+
+	// In the DVD version, play the voice and some background sound
+	if (isDVD()) {
+		if (!_heardOverviewVoice) {
+			_heardOverviewVoice = true;
+			overviewVoice.initFromAIFFFile("Sounds/Overview.aiff");
+			overviewVoice.playSound();
+		}
+
+		overviewMusic.attachFader(&overviewMusicFader);
+		overviewMusic.initFromAIFFFile("Sounds/TSA/T01NAE.NEW.32K.AIFF");
+		overviewMusic.loopSound();
+
+		FaderMoveSpec spec;
+		spec.makeTwoKnotFaderSpec(30, 0, 0, 30, 255);
+		overviewMusicFader.startFaderSync(spec);
+	}
+
 	for (;;) {
 		InputDevice.getInput(input, kFilterAllInput);
 
@@ -1196,6 +1372,10 @@ void PegasusEngine::doInterfaceOverview() {
 		if (time == 2) {
 			highlight.hide();
 			controllerHighlight.show();
+
+			// Hidden message in the DVD version
+			if (isDVD() && hiddenSpot.contains(cursorLoc))
+				time = 12;
 		} else if (i != kNumOverviewSpots) {
 			controllerHighlight.hide();
 			Common::Rect r = overviewSpots[i];
@@ -1224,6 +1404,16 @@ void PegasusEngine::doInterfaceOverview() {
 	highlight.hide();
 	_cursor->hide();
 
+	// Make sure we cut off the music and sound
+	overviewVoice.stopSound();
+
+	if (overviewMusic.isPlaying()) {
+		FaderMoveSpec spec;
+		spec.makeTwoKnotFaderSpec(30, 0, 255, 30, 0);
+		overviewMusicFader.startFaderSync(spec);
+		overviewMusic.stopSound();
+	}
+
 	_gfx->doFadeOutSync();
 	useMenu(new MainMenu());
 	_gfx->updateDisplay();
@@ -1389,6 +1579,8 @@ void PegasusEngine::checkFlashlight() {
 bool PegasusEngine::playMovieScaled(Video::VideoDecoder *video, uint16 x, uint16 y) {
 	bool skipped = false;
 
+	assert(video->isPlaying());
+
 	while (!shouldQuit() && !video->endOfVideo() && !skipped) {
 		if (video->needsUpdate()) {
 			const Graphics::Surface *frame = video->decodeNextFrame();
@@ -1442,6 +1634,7 @@ void PegasusEngine::doDeath() {
 	useMenu(new DeathMenu(_deathReason));
 	_gfx->updateDisplay();
 	_gfx->doFadeInSync();
+	_deathReason = kDeathStranded;
 }
 
 void PegasusEngine::throwAwayEverything() {
@@ -1472,9 +1665,9 @@ InputBits PegasusEngine::getInputFilter() {
 }
 
 void PegasusEngine::processShell() {
-	checkCallBacks();
 	checkNotifications();
 	InputHandler::pollForInput();
+	checkCallBacks();
 	refreshDisplay();
 }
 
@@ -1633,6 +1826,8 @@ void PegasusEngine::startNewGame() {
 	bool isWalkthrough = GameState.getWalkthroughMode();
 	GameState.resetGameState();
 	GameState.setWalkthroughMode(isWalkthrough);
+	if (isDVD())
+		Arthur.resetArthurState();
 
 	// TODO: Enable erase
 	_gfx->doFadeOutSync();
@@ -1911,12 +2106,12 @@ void PegasusEngine::dragTerminated(const Input &) {
 			delete _draggingSprite;
 	} else if (_dragType == kDragInventoryUse) {
 		if (finalSpot && (finalSpot->getHotspotFlags() & kDropItemSpotFlag) != 0) {
+			delete _draggingSprite;
 			// *** Need to decide on a case by case basis what to do here.
 			// the crowbar should break the cover off the Mars reactor if its frozen, the
 			// global transport card should slide through the slot, the oxygen mask should
 			// attach to the filling station, and so on...
 			_neighborhood->dropItemIntoRoom(_draggingItem, finalSpot);
-			delete _draggingSprite;
 		} else {
 			autoDragItemIntoInventory(_draggingItem, _draggingSprite);
 		}
@@ -2164,9 +2359,9 @@ void PegasusEngine::autoDragItemIntoRoom(Item *item, Sprite *draggingSprite) {
 		_system->delayMillis(10);
 	}
 
+	delete _draggingSprite;
 	_neighborhood->dropItemIntoRoom(_draggingItem, dropSpot);
 	allowInput(true);
-	delete _draggingSprite;
 
 	if (g_AIArea)
 		g_AIArea->unlockAI();
@@ -2197,9 +2392,9 @@ void PegasusEngine::autoDragItemIntoInventory(Item *, Sprite *draggingSprite) {
 		_system->delayMillis(10);
 	}
 
+	delete _draggingSprite;
 	addItemToInventory((InventoryItem *)_draggingItem);
 	allowInput(true);
-	delete _draggingSprite;
 
 	if (g_AIArea)
 		g_AIArea->unlockAI();
@@ -2264,8 +2459,14 @@ void PegasusEngine::doSubChase() {
 		if (video->needsUpdate()) {
 			const Graphics::Surface *frame = video->decodeNextFrame();
 
-			if (frame)
-				drawScaledFrame(frame, 0, 0);
+			if (frame) {
+				if (frame->w <= 320 && frame->h <= 240) {
+					drawScaledFrame(frame, 0, 0);
+				} else {
+					_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h);
+					_system->updateScreen();
+				}
+			}
 		}
 
 		Common::Event event;
@@ -2367,6 +2568,8 @@ void PegasusEngine::destroyInventoryItem(const ItemID itemID) {
 	g_interface->setCurrentInventoryItemID(itemID);
 	g_AIArea->playAIAreaSequence(kInventorySignature, kMiddleAreaSignature, entry.extraStart, entry.extraStop);
 	removeItemFromInventory(item);
+	if (g_arthurChip)
+		g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA26", kArthurDestroyedInventoryItem);
 }
 
 ItemID PegasusEngine::pickItemToDestroy() {
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index fb66eb7..a0d8322 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -99,6 +99,7 @@ public:
 	bool isDVDDemo() const;
 	bool isOldDemo() const;
 	bool isWindows() const;
+	bool isLinux() const;
 	void addIdler(Idler *idler);
 	void removeIdler(Idler *idler);
 	void addTimeBase(TimeBase *timeBase);
@@ -124,10 +125,12 @@ public:
 	int32 getSavedEnergyValue() { return _savedEnergyValue; }
 
 	// Death
+	Sound &getDeathSound() { return _deathSound; }
 	void setEnergyDeathReason(const DeathReason reason) { _deathReason = reason; }
 	DeathReason getEnergyDeathReason() { return _deathReason; }
 	void resetEnergyDeathReason();
 	void die(const DeathReason);
+	DeathReason getDeathReason() { return _deathReason; }
 	void playEndMessage();
 
 	// Volume
@@ -169,6 +172,8 @@ public:
 	bool canSolve();
 	void prepareForAIHint(const Common::String &);
 	void cleanUpAfterAIHint(const Common::String &);
+	void requestToggle(bool request = true) { _toggleRequested = request; }
+	bool toggleRequested() const { return _toggleRequested; }
 	Common::SeekableReadStream *_aiSaveStream;
 
 	// Neighborhood
@@ -280,14 +285,19 @@ private:
 	void doInterfaceOverview();
 	ScreenDimmer _screenDimmer;
 	void pauseMenu(bool menuUp);
+	bool _heardOverviewVoice;
 
 	// Energy
 	int32 _savedEnergyValue;
 
 	// Death
 	DeathReason _deathReason;
+	Sound _deathSound;
 	void doDeath();
 
+	// AI
+	bool _toggleRequested;
+
 	// Neighborhood
 	Neighborhood *_neighborhood;
 	void useNeighborhood(Neighborhood *neighborhood);
diff --git a/engines/pegasus/timers.cpp b/engines/pegasus/timers.cpp
index 5fb2551..e923a57 100644
--- a/engines/pegasus/timers.cpp
+++ b/engines/pegasus/timers.cpp
@@ -265,10 +265,6 @@ void TimeBase::checkCallBacks() {
 			setTime(_stopTime, _stopScale);
 		else if (getRate() > 0 && time == stopTime)
 			setTime(_startTime, _startScale);
-	} else {
-		// Stop at the end
-		if ((getRate() > 0 && time == stopTime) || (getRate() < 0 && time == startTime))
-			stop();
 	}
 }
 
diff --git a/gui/credits.h b/gui/credits.h
index bcace12..ffcd227 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -650,7 +650,7 @@ static const char *credits[] = {
 "C0""Jeroen Janssen",
 "C2""Numerous readability and bugfix patches",
 "C0""Keith Kaisershot",
-"C2""Several Pegasus Prime patches",
+"C2""Several Pegasus Prime patches and DVD additions",
 "C0""Andreas Karlsson",
 "C2""Initial port for SymbianOS",
 "C0""Claudio Matsuoka",
diff --git a/ports.mk b/ports.mk
index 306e0f0..085f1bd 100644
--- a/ports.mk
+++ b/ports.mk
@@ -9,59 +9,72 @@ install:
 	$(INSTALL) -d "$(DESTDIR)$(bindir)"
 	$(INSTALL) -c -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)"
 	$(INSTALL) -d "$(DESTDIR)$(mandir)/man6/"
-	$(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/PegasusPrime.6"
+	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/icons/"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm"
 	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/pixmaps/"
-	$(INSTALL) -c -m 644 "$(srcdir)/icons/scummvm.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm"
 	$(INSTALL) -d "$(DESTDIR)$(docdir)"
 	$(INSTALL) -c -m 644 $(DIST_FILES_DOCS) "$(DESTDIR)$(docdir)"
 	$(INSTALL) -d "$(DESTDIR)$(datadir)"
-	$(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) "$(DESTDIR)$(datadir)/"
+	$(INSTALL) -c -m 644 $(srcdir)/gui/themes/translations.dat "$(DESTDIR)$(datadir)/"
+	$(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/scummpegasus.zip "$(DESTDIR)$(datadir)/"
 ifdef DYNAMIC_MODULES
-	$(INSTALL) -d "$(DESTDIR)$(libdir)/scummvm/"
-	$(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/scummvm/"
+	$(INSTALL) -d "$(DESTDIR)$(libdir)/PegasusPrime/"
+	$(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/PegasusPrime/"
 endif
+	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/applications/"
+	$(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/PegasusPrime.desktop "$(DESTDIR)$(datarootdir)/applications/"
 
 install-strip:
 	$(INSTALL) -d "$(DESTDIR)$(bindir)"
 	$(INSTALL) -c -s -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)"
 	$(INSTALL) -d "$(DESTDIR)$(mandir)/man6/"
-	$(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/PegasusPrime.6"
+	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/icons/"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm"
 	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/pixmaps/"
-	$(INSTALL) -c -m 644 "$(srcdir)/icons/scummvm.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm"
+	$(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm"
 	$(INSTALL) -d "$(DESTDIR)$(docdir)"
 	$(INSTALL) -c -m 644 $(DIST_FILES_DOCS) "$(DESTDIR)$(docdir)"
 	$(INSTALL) -d "$(DESTDIR)$(datadir)"
-	$(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) "$(DESTDIR)$(datadir)/"
+	$(INSTALL) -c -m 644 $(srcdir)/gui/themes/translations.dat "$(DESTDIR)$(datadir)/"
+	$(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/scummpegasus.zip "$(DESTDIR)$(datadir)/"
 ifdef DYNAMIC_MODULES
-	$(INSTALL) -d "$(DESTDIR)$(libdir)/scummvm/"
-	$(INSTALL) -c -s -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/scummvm/"
+	$(INSTALL) -d "$(DESTDIR)$(libdir)/PegasusPrime/"
+	$(INSTALL) -c -s -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/PegasusPrime/"
 endif
+	$(INSTALL) -d "$(DESTDIR)$(datarootdir)/applications/"
+	$(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/PegasusPrime.desktop "$(DESTDIR)$(datarootdir)/applications/"
 
 uninstall:
 	rm -f "$(DESTDIR)$(bindir)/$(EXECUTABLE)"
-	rm -f "$(DESTDIR)$(mandir)/man6/scummvm.6"
-	rm -f "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm"
+	rm -f "$(DESTDIR)$(mandir)/man6/PegasusPrime.6"
+	rm -f "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm"
+	rm -f "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm"
 	rm -rf "$(DESTDIR)$(docdir)"
 	rm -rf "$(DESTDIR)$(datadir)"
 ifdef DYNAMIC_MODULES
-	rm -rf "$(DESTDIR)$(libdir)/scummvm/"
+	rm -rf "$(DESTDIR)$(libdir)/PegasusPrime/"
 endif
+	rm -f "$(DESTDIR)$(datarootdir)/applications/PegasusPrime.desktop"
 
 # Special target to create a application wrapper for Mac OS X
-bundle_name = ScummVM.app
+bundle_name = "Pegasus Prime™ OSX.app"
 bundle: scummvm-static
 	mkdir -p $(bundle_name)/Contents/MacOS
 	mkdir -p $(bundle_name)/Contents/Resources
 	echo "APPL????" > $(bundle_name)/Contents/PkgInfo
-	cp $(srcdir)/dists/macosx/Info.plist $(bundle_name)/Contents/
+	cp $(srcdir)/dists/pegasus/Info.plist $(bundle_name)/Contents/
 ifdef USE_SPARKLE
 	mkdir -p $(bundle_name)/Contents/Frameworks
 	cp $(srcdir)/dists/macosx/dsa_pub.pem $(bundle_name)/Contents/Resources/
 	cp -R $(STATICLIBPATH)/Sparkle.framework $(bundle_name)/Contents/Frameworks/
 endif
-	cp $(srcdir)/icons/scummvm.icns $(bundle_name)/Contents/Resources/
+	cp $(srcdir)/dists/pegasus/pegasus.icns $(bundle_name)/Contents/Resources/
 	cp $(DIST_FILES_DOCS) $(bundle_name)/
-	cp $(DIST_FILES_THEMES) $(bundle_name)/Contents/Resources/
+	cp $(srcdir)/gui/themes/translations.dat $(bundle_name)/Contents/Resources/
+	cp $(srcdir)/dists/pegasus/scummpegasus.zip $(bundle_name)/Contents/Resources/
 ifdef DIST_FILES_ENGINEDATA
 	cp $(DIST_FILES_ENGINEDATA) $(bundle_name)/Contents/Resources/
 endif
@@ -235,7 +248,7 @@ osxsnap: bundle
 # Windows specific
 #
 
-scummvmwinres.o: $(srcdir)/icons/scummvm.ico $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(srcdir)/dists/scummvm.rc
+scummvmwinres.o: $(srcdir)/dists/pegasus/pegasus.ico $(srcdir)/dists/pegasus/scummpegasus.zip $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(srcdir)/dists/scummvm.rc
 	$(QUIET_WINDRES)$(WINDRES) -DHAVE_CONFIG_H $(WINDRESFLAGS) $(DEFINES) -I. -I$(srcdir) $(srcdir)/dists/scummvm.rc scummvmwinres.o
 
 # Special target to create a win32 snapshot binary (for Inno Setup)
